如果我在C中有UTF8编码的字符串(基本上是char
- 或unsigned char
? - 数组),我想写
并从文件中读取它(比如二进制模式)。与我编写/读取ASCII字符相比,我需要做些什么不同吗?
答案 0 :(得分:2)
简短回答:不,没什么不同
更长的答案:一如既往,取决于......
这取决于您之后要用什么来读取文件。如果是其他应用程序,您可能需要通过在前面粘贴UTF-8 BOM来提示该文件是UTF-8编码文本。但是,这通常是不鼓励的,所以你通常可以回复简短的答案!
然而您的评论暗示您对处理 char数组感兴趣,而不是简单地读/写它。是的,你可能需要以不同的方式做事,完全取决于你想做什么。因为单个“unicode字符”可以编码为数组中的多个字节,对于某些操作(例如,计算文本中的字长),您需要知道多字节字符。但是因为UTF8中的所有“额外”字节都设置了高位,所以你永远不会让它们与普通字符混淆。所以像字符串搜索和替换这样的东西通常都是普通的ASCII。
答案 1 :(得分:1)
如果你只是输出它(没有计算或修改),你不必担心它。 在使用gcc的Linux上,您甚至可以将UTF8放在源代码中的字符串中,并且它可以正常工作。
E.g:
puts("řčšéíčšřáčéířáéíščřáéíčřáščéřáěéířěéčšě"); //Will work correctly on Linux
例如,č
不会由单个 char 表示。
答案 2 :(得分:1)
只要您没有实际使用标志进行数学运算就没问题,您应该没问题。
UTF8期望每个字符“单位”至少 8位,并且C chars(无论是否签名)都保证具有这些。没有什么是不同的 - 除了,当然,当你习惯于将“a”加到“b”(对文本的无意义操作)或转换为整数和从整数转换时(这是好的)因为它是“常规”ASCII文本,偶尔会有高位ASCII字符,也就是说,如果你在可能发生时处理转换,你应该没事。)
解决这个问题:如果您打算显示您的输出,您可能希望使用相同的类型 - signed或unsigned - 作为输出库。
如果我必须将UTF8输出到屏幕控制台(OSX的终端窗口,它完全能够显示UTF8),我使用常规char
字符串,因此我可以使用标准的stdlib和字符串函数。