如何解决C:为Windows编译时无法将Unicode盲文写入UTF-8文档
我有一些代码可以在Windows上的Linux BUT上很好地运行,但是只有使用Cygwin编译时才可以按预期工作,Cygwin可以模拟Linux环境。在Windows上,但对可移植性不利(您必须安装Cygwin才能使编译的二进制文件正常工作。)该程序执行以下操作:
- 以读取模式和ccs = UTF-8打开文档,并逐个字符读取它。
- 写入与该字母num相对应的盲文Unicode模式(U + 2800..U + 28FF)。或打孔标记为“目标”文档(以写入模式打开并且ccs = UTF-8打开)
重要代码:
const char *brai[26] = {
"⠁","⠃","⠉","⠙","⠑","⠋","⠛","⠓","⠊","⠚","⠅","⠇","⠍","⠝","⠕","⠏","⠟","⠗","⠎","⠞","⠥","⠧","⠭","⠽","⠵","⠺"
}
int main(void) {
setlocale(LC_ALL,"es_MX.UTF-8");
FILE *source = fopen(origen,"r,ccs=UTF-8");
FILE *dest = fopen(destino,"w,ccs=UTF-8");
unsigned int letra;
while ((letra = fgetc(source)) != EOF) {
// This next line is the problem,I guess:
fwprintf(dest,L"%s","⠷"); // Prints directly the braille sign as a char[]
// OR prints it from an array that contains the exact same sign.
fwprintf(dest,brai[7]);
}
}
代码每次都能在Linux上正常运行,但不适用于Windows。我尝试了一切,似乎没有任何输出正确。在“目标”文档上,我得到如下随机字符: 甥金字塔极肠─猀甥iꃢ¨。
到目前为止,在Windows上将盲文图案打印到文档的唯一方法是:
fwprintf(dest,L"⠷");
这不是很有用(需要对每种情况都做一个“ else if”)。 如果您想查看完整的代码,请访问Github: https://github.com/oliver-almaraz/Texto_a_Braille
到目前为止我尝试过的事情:
- 更改文件会打开UTF-16LE和UNICODE的选项。
- 以我能想到的所有方式更改fwprintf()参数。
- 将包含盲文模式的数组的数组属性更改为unsigned int。
- 不同的编译器。
解决方法
选项1:使用wchar_t
和fwprintf
。确保将源另存为带有BOM编码的UTF-8或使用UTF-8编码,并使用/utf-8
开关强制在Microsoft编译器上采用UTF-8编码;否则,MSVS假定源文件使用ANSI编码,您将获得mojibake。
#include <stdio.h>
const wchar_t brai[] = L"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺";
int main(void) {
FILE *dest = fopen("out.txt","w,ccs=UTF-8");
fwprintf(dest,L"%s",brai);
}
out.txt(编码为带有BOM表的UTF-8):
⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺
选项2:使用char
和fprintf
,将源另存为带有BOM的UTF-8或UTF-8,并使用/utf-8
Microsoft编译开关。 char
字符串将采用源编码,因此必须为UTF-8才能在输出文件中获取UTF-8。
#include <stdio.h>
const char brai[] = "⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺";
int main(void) {
FILE *dest = fopen("out.csv","w");
fprintf(dest,"%s",brai);
}
最新的编译器还可以使用u8""
语法。这样做的好处是您可以使用其他源编码,并且只要您使用适当的编译器开关来指示源编码,char
字符串仍将是UTF-8。
const char brai[] = u8"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺";
作为参考,以下是Microsoft编译器选项:
/source-charset:<iana-name>|.nnnn set source character set
/execution-charset:<iana-name>|.nnnn set execution character set
/utf-8 set source and execution character set to UTF-8
,
这是一个经过测试(在Windows上使用MSVC和mingw)的半工作示例。
#include <stdio.h>
#include <ctype.h>
const char *brai[26] = {
"⠁","⠃","⠉","⠙","⠑","⠋","⠛","⠓","⠊","⠚","⠅","⠇","⠍","⠝","⠕","⠏","⠟","⠗","⠎","⠞","⠥","⠧","⠭","⠽","⠵","⠺"
};
int main(void) {
char* origen = "a.txt";
char* destino = "b.txt";
FILE *source = fopen(origen,"r");
FILE *dest = fopen(destino,"w");
int letra;
while ((letra = fgetc(source)) != EOF) {
if (isupper(letra))
fprintf(dest,brai[letra - 'A']);
else if (islower(letra))
fprintf(dest,brai[letra - 'a']);
else
fprintf (dest,"%c",letra);
}
}
注意这些事情。
- 看不到语言环境或宽广的字符或类似内容。这些都不需要。
- 此代码仅翻译英文字母。没有标点符号或数字(我对盲文的了解还不够,但这应该很简单)。
- 由于该代码仅翻译英语字母,而其他所有内容均保持不变,因此可以向其提供UTF-8编码的文件。它将只会保留无法识别的字符而不进行翻译。如果您需要翻译带重音符号的字母,则需要更多地了解Unicode。 Here is a good place to start。
- 为简洁起见,省略了错误处理。
- 代码必须使用正确的字符集。对于MSVC,带BOM的UTF-8或UTF16,或者,如果您的MSVC版本可以识别,则使用不带BOM的UTF-8和/ utf-8编译器开关。对于mingw,只需使用UTF-8。
- 此方法不适用于Windows上的标准控制台输出。这不是一个大问题,因为Windows控制台默认情况下始终不会输出盲文字符。但是,它将适用于msys控制台和许多其他控制台。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。