我们何时应该喜欢宽字符
When should we prefer wide-character strings?
我正在现代化一个大型旧的MFC代码库,其中包含一个名副其实的字符串类型混合物:
- cstring
- std :: string
- std :: Wstring
- char*
- WCHAR_T*
- _BSTR_T
我想在内部对单个字符串类型进行标准化,并仅在第三方API(即COM或MFC函数)绝对需要时将其转换为其他类型。我和我的同事正在辩论的问题;我们应该在哪种字符串类型上进行标准化?
我更喜欢C 标准字符串之一:STD :: String或STD :: Wstring。我个人倾向于STD :: String,因为我们不需要宽字符 - 它是一个没有面向客户UI的内部代码库(即无需多语言支持)。"纯"字符串允许我们使用简单的,未修饰的字符串文字(" Hello World" vs L" Hello World"或_t(" Hello world"))。
编程社区是否有正式立场?面对多种字符串类型时,通常用作标准的"内部"存储格式?
如果我们谈论Windows,请使用STD :: WSTRING(因为我们通常需要酷字符串功能)或WCHAR_T*,如果您只通过围绕着字符串。
注意Microsoft建议在这里:使用字符串
Windows本地支持UI元素,文件名, 等等。Unicode是首选的字符编码,因为它 支持所有角色集和语言。Windows代表Unicode 使用UTF-16编码的字符,每个字符被编码 作为16位值。UTF-16字符称为宽字符, 将它们与8位ANSI字符区分开。视觉C 编译器 支持宽字符的内置数据类型WCHAR_T
也:
当微软对Windows引入Unicode支持时,它放松了 通过提供两个平行的API来过渡,一个用于ANSI 字符串,另一个用于Unicode字符串。[...]在内部,ANSI 版本将字符串转换为Unicode。
也:
新应用程序应始终调用Unicode版本。许多世界 语言需要Unicode。如果您使用ANSI字符串,那将是 不可能本地化您的应用程序。ANSI版本也是 效率较低,因为操作系统必须转换ANSI 在运行时到Unicode的字符串。[...] Windows中最新的API具有 只是一个Unicode版本,没有相应的ANSI版本。
它取决于。
在Windows编程时,我建议至少使用std::wstring
用于:
- 资源(字符串,对话等)
- 文件系统访问(Windows允许文件和目录名称中的非ASCII字符(其中包括所有"错误类型的postrophes" BTW),使用ANSI API不可能打开这些字符)
- com(BSTR始终是宽字)
- 其他面向用户的接口(剪贴板,系统错误报告等)
但是,使用单个字符字符串处理内部ASCII数据文件和 utf-8编码的更容易。快速,高效且直接。
问题中可能还没有提及其他方面,例如所使用的数据库或API,输入/输出文件等及其charsets-所有这些在决定最佳数据结构的最佳数据结构时都起着作用。工作。
"无处不在的UTF-8"是一个合理的想法。但是有 0 Windows API服用UTF-8。甚至std::experimental::filesystem
API都在Windows上使用std::wstring
,在POSIX上使用std::string
。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 我们何时应该喜欢宽字符