[英]How to deal with (presumable) UTF-8 strings in C programs on OSX
希望问题标题能很好地描述我的问题。
平台:OSX 10.8,带有clang ++编译器的llvm
我有一个带有日语或西里尔字母文件名的目录。 这些文件名在iTerm2中以en_EN.UTF-8语言环境和Monaco 10字体正确显示(例如通过ls
)(不确定语言环境/字体是否有所不同,但似乎应该如此)。 但是,不支持UTF-8的普通xterm会打印加扰的符号或“?” 非ASCII字符的字符。
这是实际的问题:
在C ++程序中,我使用dirent.h
readdir()
列出包含日语或西里尔字母文件名的目录的内容。 打印readdir()
的struct dirent
结果的d_name
属性将在Xcode终端中显示正确的字符。 即,例如,日本汉字实际上是这样显示的。 从iTerm2执行程序时也是如此。 同样,在非UFT-8 xterm中加扰字符。
由于日语文件名的字节大小不等于显示的字符数,因此我大胆地假设dirent.h
函数适用于UTF-8字符串。 所有OSX C库是否都可以这样工作?
因此,例如更改struct dirent.d_name
或对其进行strcpy
并使用更改后的字符串创建新文件是否安全? 是否有可能介入导致“ ?????”的陷阱 文件名而不是汉字被写?
设置不同的语言环境(例如“ C”)会使事情搞砸(使用setlocale(LC_ALL,"C")
时似乎不是这样)。
注意:我对dirent.h的第三方替代品不感兴趣。 我写该程序的目的只是为了阐明OSX如何处理语言环境和字符编码。
从传统的字符串处理代码的角度来看,UTF-8被设计为与ASCII向后兼容。 这包括strcpy()
和朋友。
所以是的,在您的代码中,像对待其他任何字符串*一样 ,通常可以安全地处理这些字符串。 只是在显示时才发生聪明的事情。
*,只要您不干预字符串中的各个字符。
有效的UTF8字符串不包含任何空字符,因此任何字符串操作都应适用于UTF8编码的字符串。 您可能不希望使用它的子字符串或修改其中的字节,因为某些字符被编码为多个字节。
大多数处理char*
的API都不知道,也不在乎编码,因此应该安全使用。
setlocale将影响某些操作 ,大部分与处理字符类型,排序和格式有关。
当您打印字符串时,它以一堆字节的形式消失。 终端仿真器将其解释为UTF8并选择正确的字符。 不知道unicode的xterm当然将无法正确解释它并显示正确的字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.