c++读取中文字符

jiangxiaoma111 2014-01-12 01:17:34
我现在想从一个文本中读取其中的字符,然后找到想要的文本,把它给替换掉。但是读取中文的字符的时候不能成功,总是乱码。我在网上找到的都没有,现在读取的时候,把ifstream换成wifstream,但是打开文件的时候出错。
下面的是代码
求指点。。
#include<iostream>
#include<fstream>
#include<string>
using namespace std;

//subs1是要查找的字符串
//subs2 是要将subs1从text中替换掉的字符串
void replace(wstring &text, const wstring &subs1, const wstring &subs2)
{
wcout<<subs1<<" "<<subs1.size()<<endl;
wcout<<subs2<<" "<<subs2.size()<<endl;

wstring::size_type beg = text.find(subs1);

cout<<beg<<endl;

if(beg >= text.size())
{
cout<<"不能匹配"<<endl;
return;
}

text.erase(beg, subs1.size());
text.insert(beg, subs2);

/*while(beg < text.size())
{
beg = text.find(subs1);
text.erase(beg, subs1.size());
text.insert(beg, subs2);
}*/
}

//从file中读取文本,然后将str给初始化。
void init(wifstream &is, const string &file, wstring &str)
{
is.close();
is.clear();
is.open(file.c_str());
str = L"";

if(!is)
{
cerr<<"Cannot open the file : "<<file<<endl;
return;
}
wstring line;
locale china("chs");
wcout.imbue(china);

while(getline(is,line))
{
str = str + line + L"\n";
wcout << str << endl;
}
//string s = str.rfind("\n");
str.erase(str.rfind(L"\n"), str.size());
}

//将替换好的text再重新输出到一个文件中
void output_file(wofstream &os, const string &out_file, const wstring &str)
{
os.close();
os.clear();
os.open(out_file.c_str());

if(!os)
{
cerr<<"Cannot output the string to the file : "<<out_file<<endl;
}

os<<str<<endl;
os.close();
}

int main()
{
//file path F:\\sb\\sb3\\www.bill-jc.com\\test.html
string in_file = "F:\\test3.txt";
string out_file = "f:\\test.html";
string str1_file = "f:\\test1.txt";
string str2_file = "f:\\test2.txt";

//variable
locale china("chs");
wstring text, str1, str2;
wifstream is;
wofstream os;

is.imbue(china);
os.imbue(china);

init(is, in_file, text);

while(true)
{
init(is, str1_file, str1);
init(is, str2_file, str2);

replace(text, str1, str2);

cout<<"Y/N"<<endl;
char i;
cin>>i;
if(i == 'N')
break;
}

//output_file(os, out_file, text);

return 0;
}
...全文
1275 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
http://www.baidu.com/s?wd=sinodetect&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8&rsv_sug3=8&rsv_sug4=45&rsv_sug1=4&inputT=1703 个人意见:根本解决"判断文本是以什么格式来存储"这个问题需要人而不是一段程序。
jiangxiaoma111 2014-01-16
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 楼主试试随便用哪个号称能识别汉字的编辑器打开这个文件: 内容为以下9个字节: 0xB0 0xA1 0x4A 0x55 0x55 0x4A 0xE5 0x95 0x8A
不好意思,请问一下,我应该怎么来保存这9个字节? 还有您看我下面的思路对吗? 1 C++中读取中文文本时的问题。 2 文本的编码方式与程序读取文本中的字符是什么关系? 3 当程序从文件中读取 字符时,原理是什么? 4 一个文本是怎样编码的? 5 UTF-8 ,Unicode,几种编码方式的关系。 6 编码是什么? 7 以什么样的编码存储? 8 文件存储到电脑上的方式,
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cvt\*.*
jiangxiaoma111 2014-01-16
  • 打赏
  • 举报
回复
引用 8 楼 vipcxj 的回复:
首先保证你的文件是以utf-16或ucs-2储存的,然后用wfstream读取,若要在标准输入输出设备上显示正常,还得 setlocale(LOCALE_ALL, ""); //""就是本地默认设置,LZ是中国人吧,用的中国产电脑,本地默认设置肯定就能认出中文汉字。 至于utf-8,windows上貌似不支持,必须要手动转码。当然如果LZ知道utf-8的储存格式,也不是很难,可以一字节一字节判断,然后自己转成windows支持的wchar_t的unicode,然后再显示或者查找。 如果不是unicode的,那么对于windows上的多字节编码,汉字占2字节,查找时也要按2字节查找。
用编辑器打开一个文本,不论这个文本是什么格式,一般都能正式识别。 还能查找和替换,我试过用不同的文本格式来保存。编辑器都能正常打开,并且能够查找到要寻找的文本,还能替换掉。 我现在做的就是类似查找和替换功能,可以关心文本保存的格式来实现这个功能。 现在这样的话,是否还要多写几行代码来判断文本是以什么格式来存储的,还有怎么判断文本是以什么格式来存储的?
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 楼主试试随便用哪个号称能识别汉字的编辑器打开这个文件: 内容为以下9个字节: 0xB0 0xA1 0x4A 0x55 0x55 0x4A 0xE5 0x95 0x8A
jiangxiaoma111 2014-01-16
  • 打赏
  • 举报
回复
引用 12 楼 Binzo 的回复:
引用
这个用法是在linux上的?我在linux上编译能够正常使用,但是在控制台上输出 wcout<<subs1<<" "<<subs1.size()<<endl; 这个输出中文的时候,总是乱码。不过中文文本字符替换能正常进行。
是你的“控制台”没有设好吧。
控制台?我不熟悉linux,我就试着把这个程序给编辑了下,没有设置linux。 你看我下面的想法对吗? 1 C++中读取中文文本时的问题。 2 文本的编码方式与程序读取文本中的字符是什么关系? 3 当程序从文件中读取 字符时,原理是什么? 4 一个文本是怎样编码的? 5 UTF-8 ,Unicode,几种编码方式的关系。 6 编码是什么? 7 以什么样的编码存储? 8 文件存储到电脑上的方式,
jiangxiaoma111 2014-01-16
  • 打赏
  • 举报
回复
引用 10 楼 Jim_King_2000 的回复:
把文本文件存成UTF-8。然后用下面的方法读取。 http://blog.sina.com.cn/s/blog_6b88065a01015u58.html
这样的话适用面太窄了吧。 用编辑器打开一个文本,不论这个文本是什么格式,一般都能正式识别。 还能查找和替换,我试过用不同的文本格式来保存。编辑器都能正常打开,并且能够查找到要寻找的文本,还能替换掉。 我现在做的就是类似查找和替换功能,可以不用关心文本保存的格式。 谢谢~
jiangxiaoma111 2014-01-16
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
请认真阅读我的回帖中的每个建议和链接。
嗯,好的。谢谢~
vipcxj 2014-01-16
  • 打赏
  • 举报
回复
引用 16 楼 jiangxiaoma111 的回复:
[quote=引用 8 楼 vipcxj 的回复:] 首先保证你的文件是以utf-16或ucs-2储存的,然后用wfstream读取,若要在标准输入输出设备上显示正常,还得 setlocale(LOCALE_ALL, ""); //""就是本地默认设置,LZ是中国人吧,用的中国产电脑,本地默认设置肯定就能认出中文汉字。 至于utf-8,windows上貌似不支持,必须要手动转码。当然如果LZ知道utf-8的储存格式,也不是很难,可以一字节一字节判断,然后自己转成windows支持的wchar_t的unicode,然后再显示或者查找。 如果不是unicode的,那么对于windows上的多字节编码,汉字占2字节,查找时也要按2字节查找。
用编辑器打开一个文本,不论这个文本是什么格式,一般都能正式识别。 还能查找和替换,我试过用不同的文本格式来保存。编辑器都能正常打开,并且能够查找到要寻找的文本,还能替换掉。 我现在做的就是类似查找和替换功能,可以关心文本保存的格式来实现这个功能。 现在这样的话,是否还要多写几行代码来判断文本是以什么格式来存储的,还有怎么判断文本是以什么格式来存储的?[/quote] 目前还不存在完美的办法来判断一个文件到底是什么格式的,目前的编辑器也只能做到猜个八九不离十。 比较新的编辑器保存的文件都会带BOM头,这个东西可以用来识别你的文本是什么编码。但不幸的是也有很多文件是不带BOM头的。一般的做法是一个一个试,各种编码都有一定的编码范围,如果某个字节在编码范围之外了,就说明不是这种编码,那就换一种试。当然对于纯ansii字符,即范围0-127的字符,utf-8和它是兼容的。所以你弄个纯字母的文件,有的编辑器会识别为无BOM头UTF-8编码,有的则认为是ansii编码,直到你加几个汉字进去,编辑器才能看出区别。
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
请认真阅读我的回帖中的每个建议和链接。
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
引用 18 楼 jiangxiaoma111 的回复:
[quote=引用 15 楼 zhao4zhong1 的回复:] 啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A 楼主试试随便用哪个号称能识别汉字的编辑器打开这个文件: 内容为以下9个字节: 0xB0 0xA1 0x4A 0x55 0x55 0x4A 0xE5 0x95 0x8A
不好意思,请问一下,我应该怎么来保存这9个字节? 还有您看我下面的思路对吗? 1 C++中读取中文文本时的问题。 2 文本的编码方式与程序读取文本中的字符是什么关系? 3 当程序从文件中读取 字符时,原理是什么? 4 一个文本是怎样编码的? 5 UTF-8 ,Unicode,几种编码方式的关系。 6 编码是什么? 7 以什么样的编码存储? 8 文件存储到电脑上的方式, [/quote]
#include <stdio.h>
char b[]={0xB0,0xA1,0x4A,0x55,0x55,0x4A,0xE5,0x95,0x8A};
FILE *f;
int main() {
    f=fopen("d:\\9bytes.txt","wb");
    fwrite(b,1,9,f);
    fclose(f);
    return 0;
}
Jim_King_2000 2014-01-16
  • 打赏
  • 举报
回复
引用 13 楼 jiangxiaoma111 的回复:
[quote=引用 10 楼 Jim_King_2000 的回复:] 把文本文件存成UTF-8。然后用下面的方法读取。 http://blog.sina.com.cn/s/blog_6b88065a01015u58.html
这样的话适用面太窄了吧。 用编辑器打开一个文本,不论这个文本是什么格式,一般都能正式识别。 还能查找和替换,我试过用不同的文本格式来保存。编辑器都能正常打开,并且能够查找到要寻找的文本,还能替换掉。 我现在做的就是类似查找和替换功能,可以不用关心文本保存的格式。 谢谢~[/quote] 你在编辑器里面输入中文,然后存成ANSI。然后在英文或者非中文的windows中打开,文件内容一定是乱码。文本文件必须是Unicode (UCS-16, UTF-8, ...)才能支持多国语言。
Binzo 2014-01-16
  • 打赏
  • 举报
回复
引用 14 楼 jiangxiaoma111 的回复:
控制台?我不熟悉linux,我就试着把这个程序给编辑了下,没有设置linux。 你看我下面的想法对吗? 1 C++中读取中文文本时的问题。 2 文本的编码方式与程序读取文本中的字符是什么关系? 3 当程序从文件中读取 字符时,原理是什么? 4 一个文本是怎样编码的? 5 UTF-8 ,Unicode,几种编码方式的关系。 6 编码是什么? 7 以什么样的编码存储? 8 文件存储到电脑上的方式,
实际上fstream就可以输出中文,编码默认就应该是unicode。试试这个代码可不可以正常输出“你好”:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
    fstream fs("hello.txt", ios_base::trunc | ios_base::out);
    fs << "你好" << endl;
    fs.close();
    fs.open("hello.txt", ios_base::in);
    string str;
    fs >> str;
    cout << str << endl;
    fs.close();
    return 0;
}
如果不能正常显示,你在看看你所说的控制台(我不确定你说的控制台是什么)有没有“设置或settings”的选项,将编码设为UTF-8。 如果还不行,搜一下你的编译器有没有设置语言编码的选项。
Binzo 2014-01-15
  • 打赏
  • 举报
回复
引用
这个用法是在linux上的?我在linux上编译能够正常使用,但是在控制台上输出 wcout<<subs1<<" "<<subs1.size()<<endl; 这个输出中文的时候,总是乱码。不过中文文本字符替换能正常进行。
是你的“控制台”没有设好吧。
henry.x 2014-01-15
  • 打赏
  • 举报
回复
这个问题,我貌似以前遇到过, vs2008 、vs2005 下 std::ifstream 中不 支持 中文,是因为,在vs2008 、vs2005 下,默认 传入的 unicode 字符集 ,而我们一般开发的时候 大多数 使用的 多字节字符集,所以会导致 出错 。 1、使用C语言的函数设置为中文运行环境 setlocale(LC_ALL, "Chinese-simplified"); 2、使用STL函数设置为系统语言环境 std::locale::global(std::locale("")); 3. 或者 直接 修改 log4cpp 的 参数,直接传入的是 宽字节 。
Jim_King_2000 2014-01-15
  • 打赏
  • 举报
回复
把文本文件存成UTF-8。然后用下面的方法读取。 http://blog.sina.com.cn/s/blog_6b88065a01015u58.html
c0ff 2014-01-14
  • 打赏
  • 举报
回复
windows上我一般用_wsetlocale(),中文一切正常,linux下没试过,感觉是不是还和发行版有关系?
vipcxj 2014-01-14
  • 打赏
  • 举报
回复
首先保证你的文件是以utf-16或ucs-2储存的,然后用wfstream读取,若要在标准输入输出设备上显示正常,还得 setlocale(LOCALE_ALL, ""); //""就是本地默认设置,LZ是中国人吧,用的中国产电脑,本地默认设置肯定就能认出中文汉字。 至于utf-8,windows上貌似不支持,必须要手动转码。当然如果LZ知道utf-8的储存格式,也不是很难,可以一字节一字节判断,然后自己转成windows支持的wchar_t的unicode,然后再显示或者查找。 如果不是unicode的,那么对于windows上的多字节编码,汉字占2字节,查找时也要按2字节查找。
jiangxiaoma111 2014-01-14
  • 打赏
  • 举报
回复
引用 5 楼 u010443067 的回复:
windows上我一般用_wsetlocale(),中文一切正常,linux下没试过,感觉是不是还和发行版有关系?
谢谢,我试试
jiangxiaoma111 2014-01-14
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this: fopen("newfile.txt", "rw, ccs=<encoding>"); Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file. Encodings Used Based on Flag and BOM Flag No BOM (or new file) BOM: UTF-8 BOM: UTF-16 UNICODE ANSI UTF-8 UTF-16LE UTF-8 UTF-8 UTF-8 UTF-16LE UTF-16LE UTF-16LE UTF-8 UTF-16LE
谢谢~
加载更多回复(4)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧