原始字符串文字和文件编码

2023-12-14

C++11 引入了原始字符串文字这对于表示带引号的字符串、带有许多特殊符号的文字(如 Windows 文件路径、正则表达式等)非常有用...

std::string path = R"(C:\teamwork\new_project\project1)"; // no tab nor newline!
std::string quoted = R"("quoted string")";
std::string expression = R"([\w]+[ ]+)";

这个原始字符串文字也可以与编码前缀组合(u8, u, U, or L),但是,当未指定编码前缀时,文件编码重要吗?假设我有以下代码:

auto message = R"(Pick up a card)";         // raw string 1
auto cards = R"(????????????????????????????????????????????????????????)"; // raw string 2

如果我可以编写并存储上面的代码,很明显我的源代码被编码为 un​​icode,所以我想知道:

  • The raw string 1会是一个unicode文字吗? (虽然它只使用 ASCII 字符),换句话说,原始字符串是否继承写入文件的编码,或者编译器自动检测不需要 unicode,无论文件编码如何?
  • 需要编码前缀U on the raw string 2为了将其视为 unicode 文字,或者由于其内容和/或源文件编码,它会自动成为 unicode?

感谢您的关注。

EDIT:

在 ideone.com 中测试上面的代码并打印 demangled 类型message and cards变量,它输出char const*:

template<typename T> std::string demangle(T t)
{
    int status;
    char *const name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
    std::string result(name);
    free(name);
    return result;
}

int main()
{
    auto message = R"(Pick up a card)";
    auto cards = R"(????????????????????????????????????????????????????????)";

    std::cout
        << "message type: " << demangle(message) << '\n'
        << "cards type: " << demangle(cards) << '\n';

    return 0;
}

Output:

message type: char const*

cards type: char const*

这比我想象的更奇怪,我确信这种类型是wchar_t(即使没有L字首)。


是的,这很重要,甚至编译你的源代码。你将需要使用类似的东西-finput-charset=UTF-16如果您使用的是编译gcc(同样的事情也适用于 VS)。

但我个人认为,您的代码中需要考虑一些更基本的内容。例如,std::string是容器char,大小为 1 字节。例如,如果您正在处理 UTF-16,您将需要 2 个字节,因此(尽管有“手动转换”)您将至少需要一个wchar_t(std::wstring) (或者,为了更安全char16_t,为了更安全C++11).

因此,要使用 Unicode,您需要一个容器和一个准备好处理 Unicode 编码源的编译环境。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原始字符串文字和文件编码 的相关文章

随机推荐