C++ 迭代具有混合字符长度的 utf-8 字符串

2024-01-04

我需要循环 utf-8 字符串并获取该字符串的每个字符。字符串中可能有不同类型的字符,例如一字节长度的数字、三字节长度的汉字等

我看了这个post https://stackoverflow.com/questions/2852895/c-iterate-or-split-utf-8-string-into-array-of-symbols#2856241它可以完成 80% 的工作,除了当字符串在 1 字节数字之前有 3 字节中文字符时,它会将数字视为也有 3 字节,并将数字打印为 1**,其中 * 是乱码。

举个例子,如果字符串是“今天星期五123”,则结果将是:





1**
2**
3**

其中 * 是乱码。但是,如果字符串是“123今天星期五”,则数字将正常打印。

上面提到的最小改编代码post https://stackoverflow.com/questions/2852895/c-iterate-or-split-utf-8-string-into-array-of-symbols#2856241复制到这里:

#include <iostream>
#include "utf8.h"

using namespace std;

int main() {    
    string text = "今天周五123";

    char* str = (char*)text.c_str();    // utf-8 string
    char* str_i = str;                  // string iterator
    char* end = str+strlen(str)+1;      // end iterator

    unsigned char symbol[5] = {0,0,0,0,0};

    cout << symbol << endl;

    do
    {
        uint32_t code = utf8::next(str_i, end); // get 32 bit code of a utf-8 symbol
        if (code == 0)
            continue;

        cout << "utf 32 code:" << code << endl;

        utf8::append(code, symbol); // initialize array `symbol`

        cout << symbol << endl;

    }
    while ( str_i < end );

    return 0;
}

有人能帮我一下吗?我是 c++ 新手,虽然我检查了文档utf8 cpp http://utfcpp.sourceforge.net/#introduction,我还是不知道问题出在哪里。我认为该库是为了处理具有不同长度的 utf-8 编码的问题而创建的,所以应该有一种方法可以做到这一点......已经为此奋斗了两天......


Insert

memset(symbol, 0, sizeof(symbol));

before

utf8::append(code, symbol);  

如果由于某种原因这仍然不起作用,或者如果您想摆脱该库,那么识别代码点并不那么复杂:

string text = "今天周五123";
for(size_t i = 0; i < text.length();)
{
    int cplen = 1;
    if((text[i] & 0xf8) == 0xf0) cplen = 4;
    else if((text[i] & 0xf0) == 0xe0) cplen = 3;
    else if((text[i] & 0xe0) == 0xc0) cplen = 2;
    if((i + cplen) > text.length()) cplen = 1;

    cout << text.substr(i, cplen) << endl;
    i += cplen;
}

但是,对于这两种解决方案,请注意存在多 cp 字形,以及无法单独打印的 cp

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

C++ 迭代具有混合字符长度的 utf-8 字符串 的相关文章

  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 在 Ruby 1.8.7 中将带有二进制数据的 YAML 响应转换为 UTF-8

    我正在从 API 中提取响应并接收 response job unit count 1 slug Answers lc tgt ja body tgt binary 5Zue562U lc src en body src Answers j
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐

  • 哪个加载速度更快:python 中的 pickle 或 hdf5

    给定一个 1 5 GB 的 pandas 数据帧列表 哪种格式加载压缩数据最快 pickle 通过 cPickle hdf5 还是 Python 中的其他东西 我只关心将数据加载到内存的最快速度 我不在乎转储数据 它很慢 但我只这样做一次
  • PostgreSQL 中具有夏令时的时区

    我们正在部署自己的流量计 很像 USGS 流量计 http waterdata usgs gov usa nwis uv site no 03539600 http waterdata usgs gov usa nwis uv site n
  • AppDelegate UIWindow addSubView 在不同的 viewController 中

    我正在尝试从 UIViewController 在 AppDelegate 的 UIWindow 中添加 UILabel 这就是我这样做的方式 应用程序委托代码 BOOL application UIApplication applicat
  • 按字段排序 (int)。如果字段不是int?

    我在使用 LINQ C 语言 时遇到问题 我需要按字段排序记录列表 应该是int 但有时不是 from MyObject obj in new MyObject where obj Visibile 1 orderby Int32 Pars
  • 打印目标列中最常出现的前 2 个值

    我有如下所示的三列 并尝试返回第三列的 top1 和 top2 最高计数 我希望生成此输出 如下所示预期产出 数据 打印 df AGE GENDER rating 0 10 M PG 1 10 M R 2 10 M R 3 4 F PG13
  • Google“reCaptcha”有时不会显示/渲染

    有时我必须多次重新加载网页 直到呈现 reCaptcha 我和一个朋友在 Firefox 和 Chrome 上进行了测试 但问题是一致的 并且似乎并不取决于所使用的浏览器 我用来显示 reCaptcha 的代码
  • Java归并排序,“合并”步骤应该用队列还是数组来完成?

    这不是家庭作业 我没有钱上学 所以我一边在高速公路收费站轮班工作一边自学 漫长的夜晚 几乎没有顾客 我试图通过以下方式实现一个简单的 合并排序 thinking首先 如果你想进行一些实际的学习 请稍微伸展一下我的大脑 并且then查看我正在
  • Php 数组对动态数组上的服装尺寸 (XXS XS S M L XL XXL) 和数字进行排序

    我有一个类似这样的数组 Array 0 gt XL 1 gt M 2 gt L 3 gt XL 4 gt S 5 gt XXL 但我想对我的数组进行排序 S M L XL XXL 我知道我可以用 usort 来做到这一点 但是 我得到了一些
  • 为什么“with open()”更适合在 Python 中打开文件?

    通常 当有人发布他们的代码时 人们会在旁边添加 你应该使用with open filename as f现在的语法 我同意大多数老式的f open 陈述没有附带 close 我什至回答过一些问题 其中对 隐式关闭 的依赖是他们编程问题的全部
  • Matlab 软件中的“处理”会减慢程序速度

    每当我保存 更改文件夹或有时看似随机的时间时 当前文件夹图块都会显示一个加载图标并显示 正在处理 我总是必须按 取消 否则 Matlab 软件会变慢或冻结 我的编程课上似乎没有其他人对此有问题 我正在使用 MATLAB R2015b 我可以
  • DocumentDb:没有索引的查询

    当从索引中排除所有路径时 为什么我仍然能够对 ID 以外的字段执行成功的查询 排除所有路径 collection IndexingPolicy ExcludedPaths Add new ExcludedPath Path Query SE
  • 如何从 GCM 获取 Canonical ID

    我正在尝试为我的设备获取唯一的 ID 以便我可以从我的服务器获取推送通知 正如所有教程所说 我使用 GMC 注册 GoogleCloudMessaging gcm GoogleCloudMessaging getInstance conte
  • 数组引用绑定与使用模板的数组到指针转换

    由于重载解析不明确 此代码示例无法编译 void g char t 4 void g char t int main char a 123 g a 仔细阅读重载解析规则可以清楚为什么失败 这里没有问题 如果我们正式将其改造为模板版本 tem
  • 使用IntelliJ作为git mergetool总是一启动就退出

    我已经将 IntelliJ 配置为我的 mac 上的 diff 和 mergetool 但是 git 启动它 命令行总是立即返回 而不是等待 diff 完成 这意味着所执行的更改不会反映在磁盘上 我的配置是 mergetool intell
  • 如何在 MigLayout 中获得一个向右对齐的按钮

    我正在使用 Miglayout 向面板添加一个按钮 并尝试我可能做的事情 但我无法让它转到面板的右端 它坚持向左齐平 奇怪的是 该演示在示例中有点简短 它仅在同一面板上的其他按钮的上下文中显示它 我有一个这样的面板 dialog gt co
  • 如何在 Core Graphics / Quartz 2D 中绘制圆角矩形?

    我需要绘制圆角矩形的轮廓 我知道我可以制作直线和圆弧 但也许还有圆角矩形的功能 您可以使用 UIBezierPath bezierPathWithRoundedRect cornerRadius or UIBezierPath bezier
  • unity3d 和 git 子模块可能吗?

    太长了 这将是一篇冗长的文章 但我相信许多 unity3d 开发人员也遇到了和我一样的问题 这个问题需要一个明确 一劳永逸的答案来拯救我们的集体理智 所以在过去的两年多里我一直在使用 git 但我并没有深入研究它 我可以从 bitbucke
  • UISearchBar inputAccessoryView

    The UISearchBar似乎有inputAccessoryView as a readOnly财产 如何使用我自己的 customToolbar 设置它 Edit 正如下面的评论中提到的 这不再是 iOS 6 后的问题 请参阅UISe
  • 流式传输 okhttp 响应正文

    我正在实施一个服务器发送的事件 http www w3schools com html html5 serversentevents asp使用 OkHttp 的库 服务器发送事件的工作原理是与服务器保持开放的 HTTP 连接 在服务器上
  • C++ 迭代具有混合字符长度的 utf-8 字符串

    我需要循环 utf 8 字符串并获取该字符串的每个字符 字符串中可能有不同类型的字符 例如一字节长度的数字 三字节长度的汉字等 我看了这个post https stackoverflow com questions 2852895 c it