【发布时间】:2015-08-03 23:14:01
【问题描述】:
我的设置:gcc-4.9.2,UTF-8 环境。
以下 C 程序在 ASCII 中工作,但在 UTF-8 中不工作。
创建输入文件:
echo -n 'привет мир' > /tmp/вход
这是 test.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
int main(void)
{
char buf[SIZE+1];
char *pat = "привет мир";
char str[SIZE+2];
FILE *f1;
FILE *f2;
f1 = fopen("/tmp/вход","r");
f2 = fopen("/tmp/выход","w");
if (fread(buf, 1, SIZE, f1) > 0) {
buf[SIZE] = 0;
if (strncmp(buf, pat, SIZE) == 0) {
sprintf(str, "% 11s\n", buf);
fwrite(str, 1, SIZE+2, f2);
}
}
fclose(f1);
fclose(f2);
exit(0);
}
检查结果:
./test; grep -q ' привет мир' /tmp/выход && echo OK
应该做些什么来使 UTF-8 代码像 ASCII 代码一样工作 - 不要打扰符号占用多少字节等。换句话说:在示例中更改什么以处理任何 UTF-8 符号作为一个单元(包括 argv、STDIN、STDOUT、STDERR、文件输入、输出和程序代码)?
【问题讨论】:
-
您可以查看链接nubaria.com/en/blog/?p=289
-
你的
grep模式有一个前导空格。 -
另外,不要将你的程序命名为
test,因为这是一个内置的shell。 (./test当然可以;但这是你不想保持的习惯。) -
@tripleee
grep中的空格是故意的(请参阅sprintf)。关于测试的好点。 -
"привет мир" 在 UTF-8 中是
D0 BF D1 80 D0 B8 D0 B2 D0 B5 D1 82 20 D0 BC D0 B8 D1 80,远远超过 10 个字符