在非西方语言中使用UTF-8而不是wchar_t有什么不便之处?
What are inconveniences of using UTF-8 instead of wchar_t with non-Western languages?
除了存储大小不同之外,使用wchar_t(2字节或4字节)和使用UTF-8编码进行面向非西方语言的文本处理编程有什么不同?
当使用wchar_t时,可以在C或c++库中以与非宽版本相同的方式和容易地使用宽版本的字符串函数。与使用标准字符串函数的广泛版本相比,UTF-8是否存在一些问题,它为非西方文本的字符串添加了一些额外的处理?
假设库函数适用于UTF-8(这通常不适用于Windows),那么只要您实际使用库函数,就没有真正的问题。但是,如果您编写代码手动解释字符串数组中的单个元素,则需要编写考虑到代码点在UTF-8中大于单个字节的代码-特别是在处理非英语字符(包括例如德语/斯堪的纳维亚字符,如'ä', 'ö', 'ü')时。即使每个条目使用16位,您也可以发现一个代码点占用2个16位条目的情况。
如果你不考虑到这一点,单独的部分可能会"混淆"处理,例如,将代码点中间的东西识别为具有不同含义的东西而不是某个东西的中间。
代码点的可变长度会导致各种有趣的影响,例如字符串长度和子字符串——其中in的长度是保存字符串的数组元素的数量,这可能与代码点的数量大不相同。
无论使用哪种编码,对于例如阿拉伯语的编码都有进一步的复杂性,其中需要将单个字符链接在一起。这当然只有在实际绘制角色时才重要,但至少值得记住。
术语(我的作品!):
字符 =可以显示在屏幕上的字母/符号。
码点 =字符串中字符的表示,可以是字符串数组中的一个或多个元素。
字符串数组 =字符串的存储空间,由固定大小的元素组成(如8位、16位、32位、64位)
String Element =字符串数组的一个单位
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 将WCHAR数组作为LPARAM发送到winproc的正确方法是什么?