问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++ 中string.substr有中文怎么办?

发布网友 发布时间:2022-04-22 07:45

我来回答

6个回答

懂视网 时间:2022-04-22 12:06


substr()函数中文版 普通的substr()函数可以取得字符串的指定长度子字符串,但遇到中文时可能会在新字符串末尾产生乱码,下面这个函数将超过$len长度的字符串转换成以“...”结尾,并且去除了乱码。

用法:$new = getsubstring($old,20);

function getsubstring($str,$len)
{
    for($i = 0;$i <$end;$i++)
    {
        if ($i >=0 AND $i <$end)
        {
            if(ord(substr($str,$i,1)) > 0xa1)  
                $result_str.=substr($str,$i,2);
            else
                $result_str.=substr($str,$i,1);
        }
        if(ord(substr($str,$i,1)) > 0xa1)
            $i++;
    }
    if(strlen($str)<=$end)
        return $result_str;
    else
        return $result_str."...";
}

热心网友 时间:2022-04-22 09:14

  你的这个问题需要两方面的知识:

  1.关于C++中string类的substr函数:

  substr()原型如下:

basic_string substr( size_type pos = 0, size_type count = npos );

  第一个参数off表示下标,count是子串的长度。如果没有越界异常,返回一个[pos,pos+count)的字符串。  


  2.中文字码的存储

  C语言默认存放字符串是MBCS(Multi-Byte Chactacter System(Set):多字节字符系统(字符集))格式,需要几个字节放几个字节。ASCII存放的拉丁文字(包含英文)在所有标准中不允许变,所以英文都是1B。而中文就要看你的文字系统了,但是通常是GBK,也就是双字节存储。要显示出一个汉字需要2B,只输出1B是不能显示汉字的。


  有了上面的知识我们不难解决string中有中文的问题了,只要将英文和英文符号(ASCII规定的符号)当成1B,汉字和汉字符号当成2B就可以了。

例如:

#include <iostream>
#include <string>

using namespace std;


int main()
{
    string a = "0a,\n你好,a";

    string  ascii_str = a.substr(0,4);
    //截取包含英文,换行,英文符号","
    //都是ascii编码里面的

    string gbk_str = a.substr(6,4);
    //截取汉字“好,”,因为“你”占用的是2B,所以下标要注意
    //又因为“好”和汉字符号“,”,所以也要注意截取2B+2B

    string both_str = a.substr(6,5);
    //包含汉字和英文,只要计算好所占的字节就行

    cout<<ascii_str<<endl;
    cout<<gbk_str<<endl;
    cout<<both_str<<endl;

    return 0;
}

热心网友 时间:2022-04-22 10:32

这是因为字符编码的问题,string 处理的是ANSI编码的,一个中文字符点两个单位。所以substr很可能会把这个字符截掉一半,显示出来就是乱码。
要处理中文字符这样的编码,最好的方法是使用Unicode编码的 wstring,就可以了。任何字符都是2Byte编码,一个单位可以容纳下一个字符。

热心网友 时间:2022-04-22 12:07

你使用substr()函数存在错误。
要取得'n',只需要取第三位后的一位就行了啊,如下:
string b = a.substr(3,1);

热心网友 时间:2022-04-22 13:58

需要先转成Unicode 编码

热心网友 时间:2022-04-22 16:06

找找处理中文的库吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 脸上法令纹怎么去除 男人有法令纹怎么办?怎么去除啊? 脸上有法令纹了怎么办 施工现场围挡设置有哪些要求 施工现场的围挡必须沿工地什么设置 建筑施工围挡标准 资料员证被公司扣住怎么办??? 资料员填错委托单怎么办 pygm是什么? 天津的建筑九大员证书怎么在网上注销 黑龙江住房和城乡建设厅注销资料员需要什么手续 我已离职,但我的证件始终扣在原单位不给,我如何注销那? 从公司辞职,原单位办理的资料员证不给转出或者注销,这个该找谁解决 注销水利资料员的流程 天津资料员如何注销,单位给我考的资料员,离职后却不许我带走,给钱都不行,我本身就是干资料的 天津资料员如何注销 赞美和平的句子 写一篇关于和平的好句30个字 怎么取消微博话题的赞 华为mate 9怎么验机? 莆田有哪些娱乐场所? 莆田 最好 的娱乐场所 - 信息提示 急!电脑主机箱生产流程是什么? 机箱厂工艺流程卡 机箱制图需要掌握什么 怎么去熟悉生产工艺流程 富士康组装部组装机箱的流程求大佬解答明天就要面试了啊 户外广告机机箱装配流程是怎么样的? 电脑机箱组装步骤越详细越好 我写周记用 速度啊 SUBSTR()函数的介绍 谁介绍下台式机组装的一般流程? 机箱机电属于制造业的哪一种? 小天鹅双桶XPB58—598S洗衣机排水阀有配件卖吗? 什么地方有洗衣机排水阀卖???建材城?五金店? 全自动洗衣机排水阀门坏了,谁知道哪里有卖的吗 双桶洗衣机排水阀坏掉型号xpb72一188s/198s哪里有卖 小天鹅双缸洗衣机排水阀全套在哪里买 海尔关爱洗衣机排水阀那里有买 排水阀牵引器哪里有卖的(惠浦全自动洗衣机用)