c++ - std::wstring 的标准定义字节顺序是什么?

标签 c++ string unicode standards endianness

我知道 UTF-16 有两种字节顺序:大端和小端。

C++ 标准是否定义了 std::wstring 的字节顺序?还是实现定义的?

如果是标准定义的,C++标准的哪一页规定了这个问题?

如果是实现定义的,怎么判断呢?例如在VC++下。编译器是否保证 std::wstring 的字节序严格依赖于处理器?

我必须知道这个;因为我想将UTF-16字符串发送给其他人。我必须在 UTF-16 字符串的开头添加正确的 BOM 以指示其字节顺序。

简而言之:给定一个 std::wstring,我应该如何可靠地确定它的字节顺序?

最佳答案

Endianess 依赖于机器,而不依赖于语言。 Endianess 由处理器定义,以及它如何安排数据进出内存。在处理 wchar_t(比单个字节宽)时,处理器本身在读取或写入时会根据需要对齐多个字节,以便再次读取或将其写回 RAM。代码只是将其视为处理器内部寄存器中表示的 16 位(或更大)字。

为了确定(如果这真的是你想要做的)字节顺序(你自己),你可以尝试将一个已知的 32 位(unsigned int)值写入 ram,然后使用 char 指针读回它。查找返回的顺序。

它看起来像这样:

unsigned int aVal = 0x11223344;
char * myValReadBack = (char *)(&aVal);

if(*myValReadBack == 0x11) printf("Big endian\r\n");
else                       printf("Little endian\r\n");

我确定还有其他方法,但像上面这样的方法应该有效,不过请检查我的小与大 :-)

此外,在 Windows RT 之前,VC++ 实际上只能编译为英特尔类型的处理器。他们实际上只有一种字节序类型。

关于c++ - std::wstring 的标准定义字节顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14693016/

相关文章:

c++ - 我什么时候会通过 const& std::string 而不是 std::string_view?

mysql regexp 其中一些字符 + 1 个未知字符

python - 打印列表中超过 5 个字符的每个项目的前三个字符

php - Unicode PHP 源文件

c++ - 更改 Windows DLL 加载顺序? (加载顺序,不是搜索顺序)

c++ - 写入文件

c++ - 从 QListWidget 获取小部件

c++ - 使用 boost-spirit 解析简单的 csv 表

r - R 如何处理 Unicode/UTF-8?

unicode - 对 Unicode 字符进行 URL 编码的正确方法是什么?