gpt4 book ai didi

c++11 - c++中的std::string有编码格式吗

转载 作者:行者123 更新时间:2023-12-04 01:00:30 24 4
gpt4 key购买 nike

我想找到关于 std::string 的默认编码格式。
我试图找出编码格式,但我不知道。
c++中的std::string有编码格式吗?

最佳答案

简单的答案
std::string定义为 std::basic_string<char>这意味着 它是字符的集合 .作为字符的集合,它可能包含作为 utf8 字符串编码结果的字符。

以下代码在 C++20 之前有效:

std::string s = u8"1 שלום Hello";
std::cout << s << std::endl;

it prints , 在支持它的控制台中:

1 שלום Hello


u8在括号中的字符串之前是 string literalutf8告诉编译器以下带括号的字符串具有 utf8 编码。

没有 u8前缀表示法编译器会根据编译器的源编码来获取字符串,所以如果默认编码或为编译器显式设置的编码支持字符串中的字符,它也可以像这样:
std::string s = "1 שלום Hello";
std::cout << s << std::endl;

the same output如上。然而,这取决于平台和编译器。

如果编译器的源编码不支持这些字符,例如,如果我们在 gcc 中将源编码设置为 LATIN,并带有标志 -fexec-charset=ISO-8859-1没有 u8 的字符串前缀 gives the following compilation error :
converting to execution character set:
Invalid or incomplete multibyte or wide character
std::string s = "1 שלום Hello";
^~~~~~~~~~~~~~

从 C++20 u8带括号的字符串无法转换为 std::string :
std::string s = u8"1 שלום Hello";
std::cout << s << std::endl;

gives the following compilation error在 C++20 中:
conversion from 'const char8_t [17]' to non-scalar type 'std::string'
{aka 'std::__cxx11::basic_string<char>'} requested
std::string s = u8"1 שלום Hello";
^~~~~~~~~~~~~~~~~

这是因为 u8 的类型C++20 中带括号的字符串不是 const char[SIZE]而是 const char8_t[SIZE] (类型 char8_t 是在 C++20 中引入的)。

can use但是在 C++20 中,新类型 std::u8string :
std::u8string s = u8"1 שלום Hello"; // good - std::u8string added in C++20
// std::cout << s << std::endl; // oops, std::ostream doesn't support u8string

一些有趣的笔记:
  • 直到 C++20 u8带括号的字符串是 const char[SIZE]
  • 来自 C++20 u8带括号的字符串是 const char8_t[SIZE]
  • 尺寸char8_tchar 相同, 但它是一种独特的类型


  • 漫长的故事

    在 C++ 中编码是一个悲伤的故事。这可能就是您的问题没有“简单答案”的原因。仍然没有一个完全成熟的端到端标准解决方案来处理字符编码。有标准转换器、第 3 方库等。但不是真正紧凑和简单的解决方案。希望 C++23 能解决这个问题。

    CppCon 2019 session on the subject, by JeanHeyd Meneide

    还有一个相关的问题: how std::u8string will be different from std::string?

    关于c++11 - c++中的std::string有编码格式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58606936/

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