繁体   English   中英

如何在OSX的C程序中处理(大概)UTF-8字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM