c++ - Windows 对其 Unicode 数据类型使用什么 unicode 编码(UTF-8、UTF-16 等)?

标签 c++ windows winapi unicode encoding

同一个Unicode(标准化)有不同的编码table .例如对于 UTF-8 编码 A corresponds to 0x0041 但对于 UTF-16 编码,相同的 Arepresented as 0xfeff0041

从这里brilliant article我了解到,当我使用 C++ 为 Windows 平台编程并处理 Unicode 时,我应该知道它以 2 个字节表示。但它没有说明任何关于编码的内容。 (即使它说 x86 CPU 是小端,所以我知道这两个字节是如何存储在内存中的。)但是我还应该知道 Unicode 的编码,这样我就有了关于符号如何存储在内存中的完整信息。是否有针对 C++/Windows 程序员的固定 Unicode 编码?

最佳答案

存储在 Windows 内存中的值始终是 UTF-16 little-endian。但这不是您所说的 - 您正在查看文件内容。 Windows 本身不指定文件的编码,而是将其留给各个应用程序。

您在文件开头看到的 0xfe 0xff 是一个 Byte Order Mark or BOM .它不仅表明该文件很可能是 Unicode,而且还告诉您 Unicode 编码的变体。

0xfe 0xff      UTF-16 big-endian
0xff 0xfe      UTF-16 little-endian
0xef 0xbb 0xbf UTF-8

没有 BOM 的文件应该被假定为 8 位字符,除非您知道它是如何编写的。这仍然没有告诉您它是 UTF-8 还是其他一些 Windows 字符编码,您只能猜测。

您可以使用记事本作为如何完成此操作的示例。如果文件有 BOM,则记事本将读取它并适本地处理内容。否则,您必须使用“编码”下拉列表自行指定编码。

编辑:Windows 文档没有更具体地说明编码的原因是 Windows 是 Unicode 的早期采用者,当时有 only one encoding of 16 bits per code point .当确定 65536 个代码点不足时,发明了代理对作为扩展范围的一种方式,UTF-16 就诞生了。微软已经在使用 Unicode 来指代他们的编码并且从未改变过。

关于c++ - Windows 对其 Unicode 数据类型使用什么 unicode 编码(UTF-8、UTF-16 等)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13499920/

相关文章:

c++ - 将排序范围插入关联容器的复杂性

c++ - 在 std::thread 创建的线程中调用 pthread_sigmask 是一种好习惯吗?

c# - 应用程序在 Windows 7 任务栏上的位置

ruby - 如何在 Windows 上使用 Ruby 捕获屏幕的一部分?

c# - 如何使用 Win32 图标

c++ - 使用 Win32/MFC 将 HTML 文件转换为 PDF

c++ - 优先函数

c++ - 无法编译此图像旋转代码

windows - 使用 nxlog 使用 om_ssl 将日志从 Windows 发送到 Logstash

python - 仅当我使用 PsExec 将其作为远程服务运行时编译失败