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
找找处理中文的库吧