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

2023-12-02

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


简单的答案

std::string定义为std::basic_string<char>意思是它是字符的集合。作为字符的集合,它可以潜在地保存作为编码结果的字符utf8 string.

以下代码有效直到 C++20:

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

And 它打印,在支持它的控制台中:

1 你好

The u8在括号内的字符串之前是字符串字面量 for utf8告诉编译器以下带括号的字符串具有 utf8 编码。

如果没有u8前缀表示法编译器将根据编译器的源编码获取字符串,因此如果默认编码或为编译器显式设置的编码支持字符串中的字符,它也可以像这样获取字符串:

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

with 相同的输出如上。然而,这是依赖于平台和编译器的。

如果编译器的源编码不支持这些字符,例如,如果我们在 gcc 中将源编码设置为LATIN与旗帜-fexec-charset=ISO-8859-1没有的字符串u8 prefix 给出以下编译错误:

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;

给出以下编译错误在 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";
                    ^~~~~~~~~~~~~~~~~

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

You 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

一些有趣的注释:

  1. 直到 C++20 a u8带括号的字符串是const char[SIZE]
  2. 来自 C++20 a u8带括号的字符串是const char8_t[SIZE]
  3. the size of char8_t是相同的char, 但它是一个独特的类型

故事很长

在 C++ 中,编码是一个悲伤的故事。这可能就是为什么您的问题没有“简单答案”的原因。目前还没有一个成熟的端到端标准解决方案来处理字符编码。有标准转换器、第三方库等。但不是真正紧凑且简单的解决方案。希望 C++23 能够解决这个问题。

See 关于该主题的 CppCon 2019 会议,作者:JeanHeyd Meneide

还有一个相关问题:std::u8string 与 std::string 有何不同?

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

c++中的std::string有编码格式吗 的相关文章

随机推荐

  • 切入点表达式“abc(inString)”包含不受支持的切入点原语“call”

    我对 spring aop 概念很陌生 我在编译过程中收到此错误 org aspectj weaver tools UnsupportedPointcutPrimitiveException 切入点表达式 abc inString 包含不受
  • Prolog - 复制一段列表

    我需要在序言中复制列表 我有清单 L a string1 value1 a string2 value2 a string3 value3 a string4 value4 输出将是 L string1 string2 string3 st
  • 同时在两个 PHP 脚本中使用相同的会话 ID

    我偶尔会发现 PHP 会话存在一个奇怪的问题 当我使用相同的会话 ID 运行两个 PHP 脚本时 第二个脚本会卡住 直到第一个脚本完成 我猜这是因为尝试打开同一会话存储文件两次 但可能我不对 在正常的网站工作中您永远不会发现这种效果 因为用
  • Asp.NET targetFramework 版本和 IIS 应用程序池版本不匹配

    最近我一直在 IIS 中为 Asp Net 网站创建应用程序池 让我感到惊讶的是 这些应用程序池具有 v4 0 而网站则针对 Net Framework v4 5 v4 5 1 各个网站的 Web config 中的条目 这就是应用程序池设
  • 如何将 OpenCV 集成到 Qt Creator Android 项目中

    我使用 Qt Creator 编译 Android 应用程序 我需要将 OpenCV 集成到其中 我花了半天时间才正确配置它 所以我想记录一下我在这里采取的步骤 以防其他人必须这样做 Edit 对于 OpenCV 4 x 请参阅下面的答案
  • 如何在 Nginx 代理服务器中启用 CORS?

    正如我的标题 这是位于conf d api server conf 中的配置文件 server listen 80 server name api localhost location add header Access Control A
  • TextArea MaxLength - 支持还是不支持?

    我正准备添加一个 jQuery 插件来支持文本区域的 maxlength 并注意到 MaxLength 属性在 Safari Chrome 和 Firefox 上本机工作 这到底是HTML5的功劳还是 这是否意味着文本区域的 maxleng
  • 具有多索引的 Pandas 数据透视表小计

    我正在尝试创建一个带有小计 Excel 风格的简单数据透视表 但是我找不到使用 Pandas 的方法 我已经尝试了韦斯在另一个与小计相关的问题中建议的解决方案 但这并没有给出预期的结果 下面是重现它的步骤 创建样本数据 sample dat
  • pdf 小丑 - 不突出显示特定搜索关键字

    我正在使用 pdf clown 和 pdfclown 0 2 0 HEAD jar 我编写了下面的代码来突出显示中文 pdf 文件中的关键字搜索 相同的代码在英文 pdf 文件中工作正常 import java awt Color impo
  • 使用 jQuery 的轮播

    我知道那里有可用的插件 但我正在尝试制作一个自己的插件 但在此之前我试图理解将其制作为无限 圆形轮播的概念 这是我的到目前为止 http jsfiddle net hbk35 KPKyz 3 HTML div ul li div 0 div
  • Div "contenteditable" :获取和删除插入符号之前的单词

    谢谢这个问题和 Tim Down 发布的答案 我做了一个函数来获取 contenteditable div 中插入符号之前的单词 这是一个fiddle 这是函数 function getWordPrecedingCaret containe
  • 从 powershell 为 azure 函数创建函数键

    是否有可能为刚刚从 powershell 脚本创建的 azure 函数创建一个函数键 我有一个发布管道来为 azure 函数创建整个环境 它工作正常 但我缺少的一部分是该函数的自定义函数键 我不想使用默认密钥 我可以在门户中创建新密钥 但我
  • 使用 lambda 函数对 filter() 进行复杂性分析

    给定两个列表 list1 and list2 list3 filter lambda x x in list1 list2 这将返回两个列表的交集 我怎样才能找到这个算法的复杂度 我发现时间复杂度x in list1 is O n 其中 n
  • 理解/mySQL 又名欺骗 Django 中的外键关系

    所以我继承了一些django mySQL 表非常简单 其中父级不是 FK 关系 只是 父级 id CREATE TABLE Child id int 10 unsigned NOT NULL AUTO INCREMENT parent in
  • ASP.NET 中带有和不带有委托的事件

    在一些 ASP NET 示例中 我看到事件与委托一起使用像这样有时没有他们像这样 请解释 所有事件都是委托类型 它们都继承自EventHandler继承自MulticastDelegate其间断自Delegate 有时 或者我宁愿说大多数时
  • 检查 URL 是否转到包含文本“404”的页面

    我有一个 bash 脚本来检查 URL 列表的 HTTP 状态代码 但我意识到有些虽然看起来是 200 但实际上显示包含 错误 404 的页面 我该如何检查呢 这是我当前的脚本 bin bash while read LINE do cur
  • Javascript-firefox:如何从本地 png 文件设置自定义光标?

    如何从本地图像文件为当前页面设置自定义光标 基本上我需要使用 javascript 以编程方式更改为不同的光标 但光标本地存储在我的硬盘驱动器上 你不能 但见下文 因为file 不能从其他协议访问或引用 通过 JavaScript 包含光标
  • 使用 预加载 JSON 文件

    我正在使用 Angular 5 应用程序 并且正在加载相当大的 JSON 文件 问题是加载main需要很长时间 js捆绑 初始化它 引导 Angular 应用程序 稍后获取该 JSON 文件 如果我可以在 Angular 应用程序准备就绪时
  • 如何通过php脚本发送邮件?

    我如何通过php脚本发送邮件 我正在尝试做这样的事情 for k 0 k lt x gt length 1 k for l 0 l lt j 1 l if y gt item k gt nodeValue JobNoArr l Accept
  • c++中的std::string有编码格式吗

    我想找到关于std string的默认编码格式 我想找出编码格式 但我不知道 c 中的std string有编码格式吗 简单的答案 std string定义为std basic string