4

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,但是,当没有指定编码前缀时,文件编码是否重要?假设我有这个代码:UL

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

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

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

感谢您的关注。

编辑:

在 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前缀)。

4

2 回答 2

1

原始字符串文字会更改处理转义的方式,但不会更改处理编码的方式。原始字符串文字仍将其内容从源编码转换为适当执行编码的字符串。

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

于 2014-01-30T15:59:37.993 回答
1

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

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

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

于 2014-01-30T15:59:21.467 回答