如何在C/C++中处理unicode字符序列?

aks*_*ksh 11 c c++ unicode ascii character-encoding

在C和C++中处理unicode字符序列的更便携和干净的方法是什么?

而且,如何:

- 读取unicode字符串

- 将unicode字符串转换为ASCII以保存一些字节(如果用户只输入ASCII)

- 打印unicode字符串

我也应该使用这个环境吗?我已经读过关于LC_CTYPE的例子,我应该关心它作为开发人员吗?

dan*_*n04 8

在C和C++中处理unicode字符序列的更便携和干净的方法是什么?

程序中的所有字符串都是UTF-8,UTF-16或UTF-32.如果由于某种原因需要使用非Unicode编码,请对输入和输出进行转换.

读取unicode字符串

您读取ASCII文件的方式相同.但是仍然有很多非Unicode数据,所以你要检查数据是否 Unicode.如果不是(或当你首选的内部编码是UTF-32时它是UTF-8),你需要转换它.

  • 通过验证可以可靠地检测UTF-8和UTF-32.
  • 可以通过BOM的存在来检测UTF-16.
  • 如果它不是UTF编码,则可能在ISO-8859-1或Windows-1252中.

将unicode字符串转换为ASCII以保存一些字节(如果用户只输入ASCII)

别.如果您的数据都是ASCII,那么UTF-8将占用完全相同的空间.如果不是,转换为ASCII时将丢失信息.如果你关心保存字节.

  • 选择最佳的UTF编码.对于字符U + 0000到U + 007F,UTF-8是最小的.对于字符U + 0800到U + FFFF,UTF-16是最小的.
  • 像gzip一样使用数据压缩.有一个专为Unicode设计的SCSU编码,但我不知道它有多好.

打印unicode字符串

编写UTF-8与编写ASCII没有什么不同.

除了在Windows命令提示符下,因为它仍然使用旧的"OEM"代码页.在那里你可以使用带有UTF-16字符串的WriteConsoleW.

我也应该使用这个环境吗?我已经读过关于LC_CTYPE的例子,我应该关心它作为开发人员吗?

LC_CTYPE从每种语言都有自己的字符编码,以及它自己的ctype.h功能的日子来看,这是一种延续.今天,Unicode字符数据库负责这一点.Unicode的优点在于它将字符编码处理与区域设置处理分开(除了立陶宛语,土耳其语和阿塞拜疆语的特殊大写/小写规则).

但是每种语言仍然有自己的排序规则和数字格式规则,因此您仍然需要这些语言环境.并且您需要将您的语言环境的字符编码设置为UTF-8.


Art*_*yom 0

您需要读取、打印 Unicode 或将其转换为 ASCII(如果合适)?只需使用 UTF-8,所有这一切对您来说都是绝对透明的。

  • 读、写没有区别
  • ASCII 已经是 UTF-8 的子集

对于文本分析/处理,请使用 ICU、Boost.Locale 甚至 Qt、Glib 等优秀的库,它们提供了非常好的文本分析/处理工具。