Tôi muốn đếm các ký tự (trong các bộ ký tự khác nhau) trong một tệp và tôi đang sử dụng hàm 'mbtowc' để phát hiện các ký tự. Tôi không thể tìm ra lý do tại sao các giá trị ký tự và kết quả khác nhau. Dưới đây là ví dụ của tôi:Tại sao mbtowc đếm ký tự được đặt như mong đợi?
char buf[BUFFER_SIZE + MB_LEN_MAX];
int fd = open ("chinese_test", O_RDONLY);
unsigned int bytes, chars;
int bytes_read;
bytes = chars = 0;
while((bytes_read = read(fd, buf, BUFFER_SIZE)) > 0) {
wchar_t wc_buf[BUFFER_SIZE], *wcp;
char *p;
int n = 0;
bytes += bytes_read;
p = buf;
wcp = wc_buf;
while((n = mbtowc(wcp, p, MB_LEN_MAX)) > 0) {
p += n;
wcp++;
chars++;
}
}
printf("chars: %d\tbytes: %d\n", chars, bytes);
tôi thử nghiệm chức năng với một văn bản với một số nhân vật GB2312, nhưng chars và byte là những giá trị quá khác nhau.
Trả về thử nghiệm của tôi -> ký tự: 4638 | byte: 17473 nhưng lệnh 'wc' linux trả về: ký tự: 16770 | byte: 17473
Tại sao sự khác biệt này? Tôi đã làm gì sai?
Bây giờ tôi đã có mã này nhưng vẫn có sự khác biệt so với kết quả.
char buf[BUFFER_SIZE * MB_LEN_MAX];
int fd = open ("test_chinese", O_RDONLY), filled = 0;
unsigned int bytes, chars;
int bytes_read;
bytes = chars = 0;
while((bytes_read = read(fd, buf, BUFFER_SIZE)) > 0) {
wchar_t wc_buf[BUFFER_SIZE], *wcp;
char *p;
int n = 0;
bytes += bytes_read;
p = buf;
wcp = wc_buf;
while(bytes_read > 0) {
n = mbtowc(NULL, p, MB_LEN_MAX);
if (n <= 0) {
p++;
bytes_read--;
continue;
}
p += n;
bytes_read -= n;
chars++;
}
}
printf("\n\nchars: %d\tbytes: %d\n", chars, bytes);
Tùy thuộc vào bạn 'BUFFER_SIZE' và kích thước của tập tin bạn đọc, bạn có thể nhận được chuỗi multibyte không đầy đủ . Thêm một dấu kiểm sau vòng lặp 'while' để xem liệu' n' có âm hay không. –
@JoachimPileborg, tôi biết vấn đề này. Có thể là với một tập tin của 17473 Byte và với BUFFER_SIZE = 1024 là có rất nhiều lỗi? – Figus
Có lẽ không, nhưng bạn nên kiểm tra điều này anyway. Thủ phạm có khả năng nhất là thủ phạm được nêu ra trong câu trả lời của Thụy Sĩ. –