了解 C 字符串特征

#include <iostream>
#include <string>

int main()
{
    const char * C_String = "This is a line of text w";
    const char * C_Problem_String = "This is a line of text ኚ";
    std::string Std_String("This is a second line of text w");
    std::string Std_Problem_String("This is a second line of ϯϵxϯ ኚ");

    std::cout << "String Length: " << Std_String.length() << '\n';
    std::cout << "String Length: " << Std_Problem_String.length() << '\n';

    std::cout << "CString Length: " << strlen(C_String) << '\n';
    std::cout << "CString Length: " << strlen(C_Problem_String) << '\n';
    return 0;
}

根据平台(Windows,OSX 等)和编译器(GCC,MSVC 等),此程序可能无法编译,显示不同的值或显示相同的值

Microsoft MSVC 编译器下的示例输出:

字符串长度:31
字符串长度:31
CString 长度:24
CString 长度:24

这表明在 MSVC 下使用的每个扩展字符都被认为是单个字符,并且该平台完全支持国际化语言。
但是应该注意,这种行为是不寻常的,这些国际字符在内部存储为 Unicode,因此实际上是几个字节长。这可能会导致意外错误

在 GNC / GCC 编译器下,程序输出为:

字符串长度:31
字符串长度:36
CString 长度:24
CString 长度:26

此示例演示虽然在此(Linux)平台上使用的 GCC 编译器确实支持这些扩展字符,但它也使用( 正确) 几个字节来存储单个字符。
在这种情况下,可以使用 Unicode 字符,但程序员必须非常小心地记住在这种情况下字符串长度是以字节为单位的长度,而不是可读字符长度

这些差异是由于如何在每个平台上处理国际语言 - 更重要的是,本示例中使用的 C 和 C++字符串可以被视为字节数组,因此(对于此用法) C++语言考虑字符(char)是单个字节