user-0 提问:  汉字和分隔符在一起，如何解析

回复:
user: user-1
content: //iconv_linux下字符集编码转换轻松实现 (1) iconv_t iconv_open(const char *tocode, const char *fromcode); //此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。 (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft); //此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd); //此函数用于关闭转换句柄,释放资源。  //例子1: 用C语言实现的转换示例程序  /* f.c : 代码转换示例C程序 */ #include <iconv.h> #define OUTLEN 255 main() { char *in_utf8 = "姝ｅ?ㄥ??瑁?"; char *in_gb2312 = "正在安装"; char out[OUTLEN];  /*unicode码转为gb2312码*/ rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN); printf("unicode-->gb2312 out=%sn",out); //gb2312码转为unicode码  rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN); printf("gb2312-->unicode out=%sn",out); } /*代码转换:从一种编码转为另一种编码*/ int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen) { iconv_t cd; int rc; char **pin = &inbuf; char **pout = &outbuf;  cd = iconv_open(to_charset,from_charset); if (cd==0) return -1; memset(outbuf,0,outlen); if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1; iconv_close(cd); return 0; } /*UNICODE码转为GB2312码*/ int u2g(char *inbuf,int inlen,char *outbuf,int outlen) { return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen); } /*GB2312码转为UNICODE码*/ int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen) { return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen); }  //例子2: 用C++语言实现的转换示例程序  /* f.cpp : 代码转换示例C++程序 */ #include <iconv.h> #include <iostream>  #define OUTLEN 255  using namespace std;  // 代码转换操作类  class CodeConverter {  private: iconv_t cd; public:  // 构造 CodeConverter(const char *from_charset,const char *to_charset) { cd = iconv_open(to_charset,from_charset); }   // 析构 ~CodeConverter() { iconv_close(cd); }   // 转换输出 int convert(char *inbuf,int inlen,char *outbuf,int outlen) { char **pin = &inbuf; char **pout = &outbuf;  memset(outbuf,0,outlen); return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen); } };  int main(int argc, char **argv) { char *in_utf8 = "姝ｅ?ㄥ??瑁?"; char *in_gb2312 = "正在安装"; char out[OUTLEN];  // utf-8-->gb2312 CodeConverter cc = CodeConverter("utf-8","gb2312"); cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN); cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;  // gb2312-->utf-8 CodeConverter cc2 = CodeConverter("gb2312","utf-8"); cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN); cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl; }    二、利用iconv命令进行编码转换  iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。  用法： iconv [选项...] [文件...]  有如下选项可用:  输入/输出格式规范： -f, --from-code=名称 原始文本编码 -t, --to-code=名称 输出编码  信息： -l, --list 列举所有已知的字符集  输出控制： -c 从输出中忽略无效的字符 -o, --output=FILE 输出文件 -s, --silent 关闭警告 --verbose 打印进度信息  -?, --help 给出该系统求助列表 --usage 给出简要的用法信息 -V, --version 打印程序版本号  例子: iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt 这个命令读取aaa.txt文件，从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。  小结: Linux为我们提供了强大的编码转换工具,给我们带来了方便。

user: user-0
content: 引用 12 楼 lpcads 的回复:如果含有128及以上的字符，先转为unicode，再解析，这是我的想法。。。 有没有linux下用c转换GB18030到unicode 进行处理 ，最后又把unicode转为GB18030的实例呢

user: user-2
content: 如果含有128及以上的字符，先转为unicode，再解析，这是我的想法。。。

user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

user: user-3
content: 字符集编码的自动识别jchardet：能查到不少Java的开源代码。 C的很少，你看看这个 http://lxr.mozilla.org/mozilla/source/intl/chardet/

user: user-0
content: 引用 5 楼 davidyu720 的回复:[quote=引用 4 楼 angel518 的回复:] [quote=引用 2 楼 baichi4141 的回复:] 如果是ASCII编码，从前向后，每一个大于0x80的字节和后面的字节共同构成一个非英文字符 如果是UNICODE编码，每两个字节构成一个字符 如果是UTF-8等不定长编码，去查每种语言对应的数值范围 是linux环境，在.bash_profile里有一行LANG=zh_CN.GB18030，这是否表明是用的字符集就是GB18030 这种情况下怎么解析[/quote] LANG表明你的shell工作环境的字符集，比如输出显示的字符集。  但是这个字符集与你需要处理的文本文件的字符集不见得一样。程序可以设置一个参数，表明文件的字符集。如果你的文件来源确定，那么字符集也可以确定，那参数就用不上了。  还有一种比较高级的做法，是自动读取文件的一部分内容，推测其字符集。[/quote] 有代码吗，学习下

user: user-3
content: 引用 4 楼 angel518 的回复:[quote=引用 2 楼 baichi4141 的回复:] 如果是ASCII编码，从前向后，每一个大于0x80的字节和后面的字节共同构成一个非英文字符 如果是UNICODE编码，每两个字节构成一个字符 如果是UTF-8等不定长编码，去查每种语言对应的数值范围 是linux环境，在.bash_profile里有一行LANG=zh_CN.GB18030，这是否表明是用的字符集就是GB18030 这种情况下怎么解析[/quote] LANG表明你的shell工作环境的字符集，比如输出显示的字符集。  但是这个字符集与你需要处理的文本文件的字符集不见得一样。程序可以设置一个参数，表明文件的字符集。如果你的文件来源确定，那么字符集也可以确定，那参数就用不上了。  还有一种比较高级的做法，是自动读取文件的一部分内容，推测其字符集。

user: user-0
content: 引用 2 楼 baichi4141 的回复:如果是ASCII编码，从前向后，每一个大于0x80的字节和后面的字节共同构成一个非英文字符 如果是UNICODE编码，每两个字节构成一个字符 如果是UTF-8等不定长编码，去查每种语言对应的数值范围 是linux环境，在.bash_profile里有一行LANG=zh_CN.GB18030，这是否表明是用的字符集就是GB18030 这种情况下怎么解析

user: user-4
content: 汉字乱码，一半是和 编号为128以后的图形字符混淆了，127以内的一般不会。

user: user-4
content: 可以学一下C的转义字符的处理方式 1）printf 格式串 % 代表格式， %% 代表% 本身。 %%--->% 2）字符串反斜杠，\转义序列，\\反斜杠本身。 \\---->\ UNICODE 可以这么处理： 007C ===>| 007C7CXX===> 7CXX 7CXX 表示7C开头的任意汉字。  其实 UNICODE 本身是16 BITS ，可以直接识别。 只怕MBCS才是需要另外识别的。 不过MBCS 汉字每个字节高位为1，不会和7C混淆的。 不知哪里会有问题。

user: user-5
content: 所以处理多字节编码时一定要小心

user: user-6
content: 如果是ASCII编码，从前向后，每一个大于0x80的字节和后面的字节共同构成一个非英文字符 如果是UNICODE编码，每两个字节构成一个字符 如果是UTF-8等不定长编码，去查每种语言对应的数值范围

user: user-7
content: 解析前就应该知道文本的编码格式。