C++ 字符串代码点和代码单元有什么好的解决方案吗?

2023-12-23

在 Java 中,字符串有以下方法:

length()/charAt(), codePointCount()/codePointAt()

C++11有std::string a = u8"很烫烫的一锅汤";

but a.size()是char数组的长度,无法索引unicode char。

C++ 字符串中的 unicode 有解决方案吗?


我一般会转换UTF-8字符串到宽UTF-32/UCS-2进行字符操作之前的字符串。C++实际上确实为我们提供了执行此操作的函数,但它们对用户不太友好,因此我在这里编写了一些更好的转换函数:

// This should convert to whatever the system wide character encoding 
// is for the platform (UTF-32/Linux - UCS-2/Windows)
std::string ws_to_utf8(std::wstring const& s)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cnv;
    std::string utf8 = cnv.to_bytes(s);
    if(cnv.converted() < s.size())
        throw std::runtime_error("incomplete conversion");
    return utf8;
}

std::wstring utf8_to_ws(std::string const& utf8)
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cnv;
    std::wstring s = cnv.from_bytes(utf8);
    if(cnv.converted() < utf8.size())
        throw std::runtime_error("incomplete conversion");
    return s;
}

int main()
{
    std::string s = u8"很烫烫的一锅汤";

    auto w = utf8_to_ws(s); // convert to wide (UTF-32/UCS-2)

    // now we can use code-point indexes on the wide string

    std::cout << s << " is " << w.size() << " characters long" << '\n';
}

Output:

很烫烫的一锅汤 is 7 characters long

如果您想转换为和从UTF-32无论平台如何,您都可以使用以下(未经充分测试)转换例程:

std::string utf32_to_utf8(std::u32string const& utf32)
{
    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cnv;
    std::string utf8 = cnv.to_bytes(utf32);
    if(cnv.converted() < utf32.size())
        throw std::runtime_error("incomplete conversion");
    return utf8;
}

std::u32string utf8_to_utf32(std::string const& utf8)
{
    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cnv;
    std::u32string utf32 = cnv.from_bytes(utf8);
    if(cnv.converted() < utf8.size())
        throw std::runtime_error("incomplete conversion");
    return utf32;
}

NOTE: As of C++17 std::wstring_convert is 已弃用.

However我仍然更喜欢使用它而不是第三方库,因为它是portable,它避免了外部依赖性,在提供替换之前不会将其删除,并且在所有情况下都可以轻松替换实施无需更改使用这些函数的所有代码。

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

C++ 字符串代码点和代码单元有什么好的解决方案吗? 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 一个按钮是否可以有 2 种不同的背景颜色(以及 css 按钮)

    我想要实现的就是这样的事情 你好 hi 位于两种颜色的中间 我让它适用于一种颜色和下面的另一种颜色 但希望颜色在文本中间分开 如果没有人能想出使用 css 的解决方案 我将使用按钮图像 尽量避免使用图像 编辑 当然CSS结果必须跨浏览器 即
  • 最后一个分叉的孩子不会死

    我的主进程分叉了两次 从而创建了两个子进程 这两个孩子是这样相互沟通的 ls more 现在的问题是 第二个孩子永远不会死 这是为什么 管道中的最后一个孩子什么时候真正死亡 删除一个wait 调用显示了预期结果ls more但给出了一些进一
  • 如何使用 SevenZipSharp 创建压缩的 SFX 文件?

    我将了解如何使用 SevenZipSharp 库创建 SFX 首先 我需要说我找不到任何属性来设置压缩级别 等等 当我尝试制作文件的 SFX 时 出现以下错误 Object reference not set to an instance
  • WinForms 中的 WPF 控件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 NET 世界的新手 对 winform 的经验很少 我想知道是否可以将WPF与Winforms混
  • JavaScript 中 FileReader#readEntries 可以读取的目录最大文件数

    我正在创建一个 Chrome 应用程序 我必须读取目录的文件并且我正在使用目录入口API https developer mozilla org en US docs Web API DirectoryEntry and 目录读取器API
  • 如何创建一个程序来列出 Mac 中的所有 USB 设备?

    我对 Mac OS X 操作系统的接触有限 现在我开始使用 Xcode 并正在研究 I O 套件 我需要在命令行工具下在 Xcode 中创建一个程序 以便列出 Mac 系统中连接的所有 USB 设备 请有过这方面经验的人帮帮我 如果有人可以
  • Rails form_for collection_select 忽略 select_tag 接受的远程 ajax 调用

    在让我的表单助手工作之前 我使用以下内容作为我的选择下拉列表 这非常适合调用我的 filter by city js erb 并更新一些其他值 使用
  • Python 3.7:将代理应用于 pip 安装的所有部分,无法维护代理变量

    我有以下问题 我正在使用命令 pip install pyinstaller proxy http webdefence global blackspider com 80 trusted host pypi python org 我遇到的
  • 通过正则表达式进行不区分大小写的有序单词搜索

    我刚开始使用 Perl 中的正则表达式 在尝试了各种在线教程之后 我想要编写一个正则表达式来匹配顺序指定的不区分大小写的单词匹配 我正在尝试确定字符串 A 是否由字符串 B 的单词或单词序列组成 并且我想不区分大小写地执行此操作 例如 如果
  • React 无状态组件 - 性能和 PureRender

    大家都说用stateless组件将提高应用程序性能 然而 我注意到在错误的地方使用无状态组件真的会reduce应用性能 发生这种情况是因为无状态组件总是渲染 即使属性没有改变 如果是stateful我们可以使用的组件PureComponen
  • 如何居中和左对齐图像?

    我正在创建一个图像库 希望图像的容器完全居中在页面上 但图像保持对齐 这是我想要的输出 但是 当我尝试做一个text align center在容器上 id gallery 我得到的图像显示如下 我尝试效仿之前的堆栈溢出问题 CSS 居中块
  • 从 Gradle 开始 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我不知道像 Ant Maven 或
  • open()、_open() 和 fopen() 在 MSVC 编译器方面的区别?

    我发现这三个函数都与打开文件有关 open https msdn microsoft com en us library ms235491 v vs 120 aspx 此 POSIX 函数已弃用 使用符合 ISO C 标准的 open 反而
  • symfony2 和doctrine2 较短的实体名称

    谁应该摆脱在 DQL 查询中使用命名空间 我想为我的包中的所有学说请求分配默认名称空间 在查询生成器中使用默认命名空间也是完美的 我想拥有 dql select i from MyCompanyMySuperPuperBundle Issu
  • 有没有办法检查Java中的流是否是有限的? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我知道有infiniteJava 中的流 有没有办法检查流是否是有限的 像这样的方法isStreamFinite Stream
  • 如何在 Windows 7 中更改 git shell 的起始目录

    我下载并安装了 GitHub 提供的程序 包括 Git Shell 问题是我想将 Git Shell 程序的主目录设置为自定义目录 但我不知道该怎么做 我尝试从 Git Shell 快捷方式的属性菜单中更改 开始于 字段 但没有成功 任何人
  • 使列表尽可能不排序的函数

    我正在寻找一个函数来使列表尽可能不排序 最好用Python 背景故事 我想检查 URL 状态并查看 URL 是否给出 404 我只是用asyncio and requests模块 没有什么花哨 现在我不想让服务器超载 所以我想尽量减少同时检
  • 我可以在 OpenGL 中使用不同的多 GPU 吗?

    我读到OpenGL 多 GPU 支持 https stackoverflow com questions 43811699 opengl multi gpu support 我目前使用的是支持 OpenGL 4 5 的 NVIDIA 卡 我
  • 如何在 PHPSESSID cookie 中设置 PATH?

    我的服务器上运行着许多项目 所有这些项目都使用 PHP 会话进行身份验证 现在 由于 PHPSESSID cookie 将 cookie 路径设置为 set cookie 标头中的 因此该 cookie 在整个域中可用 而我需要它仅对当前应
  • C++ 字符串代码点和代码单元有什么好的解决方案吗?

    在 Java 中 字符串有以下方法 length charAt codePointCount codePointAt C 11有std string a u8 很烫烫的一锅汤 but a size 是char数组的长度 无法索引unicod