有哪些更加轻便和干净的方式来处理C和C++中的Unicode字符序列?
此外,如何:
- 读取Unicode字符串
- 将Unicode字符串转换为ASCII以节省一些字节(如果用户仅输入ASCII)
- 打印Unicode字符串
我应该使用环境吗?例如,我已经阅读了LC_CTYPE,作为开发人员,我应该关心它吗?
有哪些更加轻便和干净的方式来处理C和C++中的Unicode字符序列?
此外,如何:
- 读取Unicode字符串
- 将Unicode字符串转换为ASCII以节省一些字节(如果用户仅输入ASCII)
- 打印Unicode字符串
我应该使用环境吗?例如,我已经阅读了LC_CTYPE,作为开发人员,我应该关心它吗?
我也应该使用环境吗? 我已经了解了 LC_CTYPE,作为开发人员,我需要关注它吗?
LC_CTYPE
是过去每种语言都有自己的字符编码和 ctype.h
函数时代的遗留物。今天,Unicode Character Database 负责处理这个问题。Unicode 的美妙之处在于它将字符编码处理与区域设置处理分开(除了立陶宛语、土耳其语和阿塞拜疆语的 特殊大写/小写规则)。
但是,每种语言仍然有自己的排序规则和数字格式规则,因此您仍然需要区域设置来处理这些内容。并且您需要将您的区域设置的字符编码设置为 UTF-8。
std::setlocale
函数。这将允许你设置与所需编码相对应的区域设置,例如,如果你想使用英式英语作为语言和UTF-8作为编码,则需要将LC_CTYPE设置为en_GB.UTF8。std::wstring
对于 UTF16(在 Windows 上)和 UTF32(在 Mac/Linux 上)可以很有用。UTF8 的最大问题在于它是一种可变宽度编码,因此 char
或 wchar_t
可能无法跨平台表示 Unicode 字符。 - dirkgently如果需要读取、打印或将Unicode转换为ASCII,只需使用UTF-8即可,这对您来说完全透明。
对于文本分析/处理,请使用像ICU、Boost.Locale或甚至Qt、Glib这样的优秀库,它们提供了相当好的文本分析/处理工具。
在这篇回答之前,有很多好的答案,但是没有一个提到我认为可能存在的问题,因为这个问题也有 C
标签。我的 C 知识已经过时了,如果我错了,请纠正我。
请注意,传统的 C 字符串函数和 UTF-16 编码数据流以及零终止字符串可能是一个棘手的组合,因为在 UTF-16 中,许多西方字母数字字符将被编码为两个字节,其中另一个字节都是零,因此将字符数据读取为一系列的 char
不再像单字节字符集那样简单。