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

Raw string literals and file codification

本文关键字:文件 编码 文字 字符串 原始      更新时间:2023-10-16

c 11介绍了原始字符串文字,对于表示引用字符串,带有许多特殊符号(例如Windows File Paths,Regex Expressions等)的文字非常有用...

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

此原始字符串文字也可以与编码前缀(u8uUL)结合使用,但是当未指定未指定编码前缀的前缀时,文件编码很重要吗?,让我假设我有此代码:<<<<<<<</p>

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

如果我可以编写和存储上面的代码,则显然我的源代码被编码为Unicode,所以我想知道:

  • raw string 1是Unicode字面的?(尽管它仅使用ASCII字符),换句话说,RAW字符串是否继承了文件的编码,或者不需要Unicode的编译器自动检测,而不论文件编码如何?
  • 为了将其视为Unicode文字,或者由于其内容和/或源文件编码吗?
  • raw string 2上的编码前缀U是必不可少的。

感谢您的关注。

编辑:

在IDEONE.com中测试上面的代码并打印 messagecards变量的脱角类型,它输出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;
}

输出:

message type: char const*

cards type: char const*

甚至比我想象的最奇怪,我坚信该类型是wchar_t(即使没有L前缀)。

是的,即使是编译您的来源也很重要。如果您使用的是gcc,则需要使用-finput-charset=UTF-16之类的单曲来编译(同一件事应适用于VS)。

但是我ihmo,在您的代码中要考虑到更多的基础。例如,std::stringchar的容器,即1个字节大。例如,如果您要处理UTF-16,则需要2个字节,因此(尽管"手机转换")至少需要wchar_t(STD :: WSTRING)(或者更安全的char16_t,在C++11中更安全。

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

原始字符串文字更改逃逸的处理方式,但不要更改编码的处理方式。原始字符串文字仍将其内容从源编码转换为在适当的执行编码中产生字符串。

字符串字体的类型和适当的执行编码完全由前缀确定。仅R在狭窄的执行编码中总是会产生char字符串。如果源是UTF-16(并且编译器支持UTF-16作为源编码),则编译器将将字符串文字内容从UTF-16转换为狭窄的执行编码。