探讨C++处理中文问题

illuminati 2011-06-26 09:11:06
C++处理中文最近弄得我头都大了一圈。感觉C++对中文支持的太不好了,这个问题更是没有头绪。
有一段中文的文本,其中所有的字符都是中文字符,包括数字。如何编写程序判断字符是否为数字。
我想了几个解决方案结果都以失败告终:
1. 以wfstream读入文本,然后创建wstring数组,数组元素分别为0 1 2 3 ...分别比较wsfream读入的文本和上述数组中的元素是否相同。结果发现wfstream中读入的数字和我自己创建的数组里的数字编码根本不一样,结果这个方案以失败告终。

2. 这回我怒了,既然文本中的编码和我自己赋的值的编码不一样,那好,我单独创建一个文本文件temp.txt,里面存有0 1 2 3, ...,然后先读temp.txt到数组中,然后再将数组与文本进行比较。但还是以失败告终,两个文件的编码居然也不一样。

靠,C++处理中文怎么这么恶心啊。。。。。。
求教各位大牛解决方案。大家用C++处理中文的方法都是什么啊。
...全文
282 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltb1209 2011-06-27
  • 打赏
  • 举报
回复
不懂,学习中
白云飘飘飘 2011-06-26
  • 打赏
  • 举报
回复

wfstream wfs;
.....................
wfs.imbue(locale( "chs"));
在用wfstream读写文件之前要进行上面的设置,chs在vs中代表中文,这个标准中没有规定,看gcc中用什么代表中文,或许空字符串就可以""。
hongwenjun 2011-06-26
  • 打赏
  • 举报
回复
http://code.google.com/p/msvc/downloads/list

MSVC_2010_SP1_x64.7z MSVC 2010 SP1 x64 Portable Version Featured Mar 29 Mar 29 26.4 MB 32
MSVC_2010_SP1_x86.7z MSVC 2010 SP1 x86 Portable Version Featured Mar 29 Mar 29 26.7 MB 49

有两个 MSVC2010编译器一个 64位,一个 32位,下载下来,解压开就可以用。
CB 中使用,相关路径配置一下就可以了.

VC2010 对C++ 的标准支持还不错。
illuminati 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hongwenjun 的回复:]

引用 11 楼 wsllittlebird 的回复:

引用 10 楼 hongwenjun 的回复:

C/C++ code
#include <iostream>
#include <fstream>

using namespace std;
int main ()
{
wchar_t text= L'一';
wcout.imbue(locale( "chs"));……
[/Quote]
恩,不过GCC好像更标准些吧,还有,怎么用codeblocks调用vs2010啊
hongwenjun 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wsllittlebird 的回复:]

引用 10 楼 hongwenjun 的回复:

C/C++ code
#include <iostream>
#include <fstream>

using namespace std;
int main ()
{
wchar_t text= L'一';
wcout.imbue(locale( "chs")); //需要设置imbue才能输出中文字符 // set l……
[/Quote]

GCC 和 VC 编译器 有些不同,这样用 GCC 会运行时错误
我是 CodeBlocks 调用 VC2010编译器的
illuminati 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dizuo 的回复:]

C/C++ code
#include <iostream>
#include <fstream>
#include <string>
#include <locale>

using namespace std;

template <size_t N>
inline bool is_valid(const char (&str)[N])
{
for (size_……
[/Quote]
不过我要查找的数字是中文编码的,不是英文编码的是这个1 2 3 4 5
illuminati 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hongwenjun 的回复:]

C/C++ code
#include <iostream>
#include <fstream>

using namespace std;
int main ()
{
wchar_t text= L'一';
wcout.imbue(locale( "chs")); //需要设置imbue才能输出中文字符 // set locale to argument
wfst……
[/Quote]
不行啊,我的编译环境一加上wcout.imbue(locale( "chs"));这句就直接退出了 :In __cxa_throw () ()
我的是codeblocks编译环境,gcc编译器
hongwenjun 2011-06-26
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>

using namespace std;
int main ()
{
wchar_t text= L'一';
wcout.imbue(locale( "chs")); //需要设置imbue才能输出中文字符 // set locale to argument
wfstream wfcin;
wfcin.open("r://out.txt", wfstream::in);
wfcin.imbue(locale( "chs"));
for (int ix =0 ; ix !=70000 ; ix++ ) {
wfcin >> text;
wcout << text++;
}

wfcin.close();

return 0;
}


刚才使用 wfstream 输出哪个 TXT
可以用这个代码正常读进来
ryfdizuo 2011-06-26
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>
#include <string>
#include <locale>

using namespace std;

template <size_t N>
inline bool is_valid(const char (&str)[N])
{
for (size_t i=0; i<N-1 && str[i] != 0; ++i)
{
unsigned char ch = str[i];
char szChinese[3] = {0};
if (ch > 0x8E && ch < 0xFF) //中文字符
{
ch = str[i+1];
if (ch >= 0x40 && ch < 0xFF)
{
szChinese[0] = str[i];
szChinese[1] = str[i + 1];
printf("%s\n", szChinese);
++i;
continue;
}
else
{
return false;
}
}
else if (isdigit(str[i]) || isalpha(str[i])) //英文字符 数字
{
printf("%c\n", str[i]);
continue;
}
}
return true;
}

int main()
{
ifstream infile("test.txt");
char line[100];

infile.getline(line, 100);

is_valid(line);

//const char buf[] = "test你好12345";
//is_valid(buf);

infile.close();

system("PAUSE");
return 0;
}

测试了一下,木有问题。
test.txt为asc编码 ,内容为:test你好12345
输出:
t
e
s
t


1
2
3
4
5
请按任意键继续. . .
hongwenjun 2011-06-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int main ()
{
wchar_t text= L'一';
wcout.imbue(locale( "chs")); //需要设置imbue才能输出中文字符 // set locale to argument
for (int ix =0 ; ix !=70000 ; ix++ )
wcout << text++;
return 0;
}

/*

locale __CLR_OR_THIS_CALL imbue(const locale& _Loc)
{ // set locale to argument
locale _Oldlocale = ios_base::imbue(_Loc);
if (rdbuf() != 0)
rdbuf()->pubimbue(_Loc);
return (_Oldlocale);
}
*/


wcout.imbue(locale( "chs")); //需要设置imbue才能输出中文字符 // set locale to argument
不知道这个对你有没帮助
ryfdizuo 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wsllittlebird 的回复:]

引用 3 楼 dizuo 的回复:

可能跟txt编码方式有关

是啊,我感觉也是,不过用什么办法来解决这个问题呢,纠结好几天了。。
[/Quote]
用文本编辑软件打开txt,然后另存为 修改文件编码方式。
hongwenjun 2011-06-26
  • 打赏
  • 举报
回复
你用 wfstream 流,输出 TXT,看看是什么编码
然后把你的 tmp.txt 复制进去 再试试
illuminati 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hongwenjun 的回复:]

wfstream中读入的数字和我自己创建的数组里的数字编码根本不一样
你编码一样不是就可以了吗
[/Quote]
不好意思,我还是个新手,怎么让编码一致啊。或者说这种问题你怎么解决啊。
illuminati 2011-06-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dizuo 的回复:]

可能跟txt编码方式有关
[/Quote]
是啊,我感觉也是,不过用什么办法来解决这个问题呢,纠结好几天了。。
ryfdizuo 2011-06-26
  • 打赏
  • 举报
回复
可能跟txt编码方式有关
hongwenjun 2011-06-26
  • 打赏
  • 举报
回复
wfstream中读入的数字和我自己创建的数组里的数字编码根本不一样
你编码一样不是就可以了吗
illuminati 2011-06-26
  • 打赏
  • 举报
回复
自己先顶一下,大家快来帮我啊!
ys793914049 2011-06-26
  • 打赏
  • 举报
回复
9494 太恶心了

64,682

社区成员

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

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