c++ string strInfo="硚"; 不包含 字符 ~,使用find也返回1

#include <iostream>
#include <string>
using namespace std;
inline string&   replace_all(string&   str, const   string&   old_value, const   string&   new_value)
{
	while (true)
	{
		string::size_type   pos(0);
		pos = str.find(old_value);
		//cout <<pos<< endl;
		if ( (pos = str.find(old_value)) != string::npos   )
			str.replace(pos, old_value.length(), new_value);
		else
			break;
	}
	return   str;
}

int main() {
			string strInfo="硚";
			string::size_type   pos(0);
			string strInfo1="~";
			pos =strInfo.find(strInfo1);
			cout <<pos<< endl; 
			strInfo = replace_all(strInfo, "~", "#$");//
			cout <<strInfo<< endl; // prints !!!Hello World!!!
}

烦请大神解答下,string strInfo="硚"; 不包含 字符 ~,使用find也返回1

颍川道人
浏览 1452回答 1
1回答

onemoo

哈哈,这个很有意思。因为我觉得也不应该 find 到,所以我就在我这里试了下,果然没找到!可你却找到了!那么我猜得这是编码问题(因为我默认用的是 UTF-8 编码),而且我猜你是在 Windows 系统下。我据此去查了下‘硚’的编码,果然如此。这个结果非常有趣,我说一下:Windows 使用的 ANSI 编码会将一个汉字编码为两字节。“硚”这个字的编码是 b3 7e。“~”的编码是 7e,恰好是硚编码的第二个字节!而 string 表示的是 char 字符串,也就是会把每个字符当作 char 来处理——即会按字节来处理,所以 find 按 char 来查找就找到了 7e!一般来说,涉及汉字的编码会比较复杂,在初学做字符串的实验时不要用汉字!P.S. 如果你一定要用汉字的话,就要用能够处理“宽字符”的库函数。std::wstring 是保存宽字符的字符串,在写字符串字面量时在前面加上 L 表示其为宽字符串:std::wstring wchn = L"硚"; std::wstring wtilde = L"~"; cout << wchns.find(wtilde) << endl;这样应该就找不到了。 不过在初学时还是尽量避免用汉字吧!
打开App,查看更多内容
随时随地看视频慕课网APP