gpt4 book ai didi

c++ - 原始字符串文字和文件编码

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:26 25 4
gpt4 key购买 nike

C++11 引入了 raw string literals这对于表示带引号的字符串、带有许多特殊符号(如 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]+[ ]+)";

这个原始字符串文字也可以与编码前缀( u8uUL )结合使用,但是,当没有指定编码前缀时,文件编码是否重要?假设我有这段代码:

auto message = R"(Pick up a card)";         // raw string 1
auto cards = R"(🂡🂢🂣🂤🂥🂦🂧🂨🂩🂪🂫🂬🂭🂮)"; // raw string 2

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

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

感谢您的关注。

编辑:

在 ideone.com 中测试上面的代码并打印出 message 的 demangled 类型和 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;
}

输出:

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 编码源的编译环境。

关于c++ - 原始字符串文字和文件编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21460700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com