C++如何将一个unicode big endian编码格式的文件转换为GB2321 或者其他格式

忘世麒麟 2016-04-29 08:53:02
如题。
其他的编码格式转换我都解析完毕了,就是unicode big endian我还 没找到合适的方法。最笨的方法倒是有:将文件的内容读出过后依次置换高地位,转换为unicode little endian然后转换成需要的格式,但是这个方法我真是感觉有点恶心。
请问,有没有做过这一块的同行,给个例子给我,或者贴点代码。
ps:百度以及bing的前几页都看过了,没有找到合适的。
谢谢!
...全文
361 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2016-05-04
  • 打赏
  • 举报
回复
WideCharToMultiByte 第一个参数可以传 1200 或 1201... 1200 utf-16 Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications 1201 unicodeFFFE Unicode UTF-16, big endian byte order; available only to managed applications 没试过...
lm_whales 2016-04-29
  • 打赏
  • 举报
回复
如果是文件,只需要文件有个标志就可以了 如果使自己处理 确实需要转换一下
赵4老师 2016-04-29
  • 打赏
  • 举报
回复
推荐使用convertz软件。
WinExec("convertz /i:ube /o:gbk in.txt out.txt",SW_HIDE);
语法:convertz [CodeIn] <CodeOut> [Face] <FileIn> [FileOut]

[CodeIn]  输入编码 (可省略)

	参数	输入的编码方法
	----------------------------------------------
	/i:ule	Unicode Little Endian
	/i:ube	Unicode Big Endian
	/i:utf8	UTF-8
	/i:gbk	GBK
	/i:big5	Big5
	/i:jis	JIS (日文)
	/i:sjis	Shift-JIS (日文)
	/i:euc	EUC-JP (日文)

*在省略这参数的情况下,程式会自动侦测来源档案的编码。若果来源档案是 GBK 或 Big5 码,
建议当档案里面有多于100个中文字时才用这功能,否则程式可能会错误判断编码。

<CodeOut>  输出编码

	参数	输出的编码方法
	-----------------------------------------------
	/o:ule	Unicode Little Endian
	/o:ube	Unicode Big Endian
	/o:utf8	UTF-8
	/o:gbk	GBK
	/o:big5	Big5
	/o:jis	JIS (日文)
	/o:sjis	Shift-JIS (日文)
	/o:euc	EUC-JP (日文)

[Face]   输出字体,预设值是 /f:d (可省略)

	参数	输出的字型
	-----------------------------------------------
	/f:t	繁体字型 (Traditional)
	/f:s	简体字型 (Simplified)
	/f:d	直接转换不做词汇修正

	输入编码	输出编码	预设值
	--------------------------------------------------
	GBK	Big5		繁体
	Big5	GBK		简体
	其它的编码转换		不变(用回原本的字体)

* 若果输出编码是 Big5  /f:s 参数无效
* 若输入或输出编码是 jis/shift-jis/euc-jp,/f:s 及 /f:t 参数皆无效

<FileIn>   输入档案的路径+名称,支援万用字符

[FileOut] 输出档案的路径+名称,支援万用字符(可省略)

* 在 FileOut 省略的情况下,转码结果会覆写到 FileIn
* 若档案名称包含空白格,须要在档名的前后两端加入双引号 (")

例体:

1) 	convertz /i:big5 /o:ule /f:s test1.txt test2.txt

上述指令会将 test.txt 的内容由 Big5 转为简体中文的 Unicode-LE 编码并将结果储存到 test2.txt。

2) 	convertz /i:utf8 /o:big5 *.*

上述指令将当前目录的所有档案由 utf-8 转做 big5 码,输出结果会覆写原来的档案。

3) 	convertz /o:ule /f:t k*.txt "D:\Temp Dir\*.abc"

上述指令会搜寻当前目录内所有档名首个字母是 k 及副档名是 txt 的档案,自动侦测它们的原来编码,
然后逐一转换成为繁体 Unicode-LE, 并另存到 'D:\Temp Dir' 目录,新档案名称跟原来档案相同但副档名会改做 abc。
lm_whales 2016-04-29
  • 打赏
  • 举报
回复
忘世麒麟 2016-04-29
  • 打赏
  • 举报
回复
引用 7 楼 chehw_1 的回复:
[quote=引用 6 楼 baijiaheizhiganmao 的回复:] [quote=引用 5 楼 chehw_1 的回复:] 可以手工生成UTF-16BE->gb2312的代码页,存到一个unsigned short code_page[65536]的数组中。 code_page[wchar_utf-16be] = uchar_gb2312;
为什么要65536呢?直接计算一下文件的长度,然后new一个出来不久可以不浪费内存吗?[/quote] 只不过128K内存,并不算很浪费。如果你需要转换的数据量比较大,这样做效率会比较高,用空间来换取时间。你可以直接把任何一个unsigned short数值(utf016be字符)作为索引,直接取得对应的gb2312码(可以用-1表示无效编码),不用做额外判断也不用担心会出现数组越界问题。[/quote] 也对!分情况使用吧。不过我弄出来 。还是谢谢你
chehw_1 2016-04-29
  • 打赏
  • 举报
回复
引用 6 楼 baijiaheizhiganmao 的回复:
[quote=引用 5 楼 chehw_1 的回复:] 可以手工生成UTF-16BE->gb2312的代码页,存到一个unsigned short code_page[65536]的数组中。 code_page[wchar_utf-16be] = uchar_gb2312;
为什么要65536呢?直接计算一下文件的长度,然后new一个出来不久可以不浪费内存吗?[/quote] 只不过128K内存,并不算很浪费。如果你需要转换的数据量比较大,这样做效率会比较高,用空间来换取时间。你可以直接把任何一个unsigned short数值(utf016be字符)作为索引,直接取得对应的gb2312码(可以用-1表示无效编码),不用做额外判断也不用担心会出现数组越界问题。
忘世麒麟 2016-04-29
  • 打赏
  • 举报
回复
引用 5 楼 chehw_1 的回复:
可以手工生成UTF-16BE->gb2312的代码页,存到一个unsigned short code_page[65536]的数组中。 code_page[wchar_utf-16be] = uchar_gb2312;
为什么要65536呢?直接计算一下文件的长度,然后new一个出来不久可以不浪费内存吗?
chehw_1 2016-04-29
  • 打赏
  • 举报
回复
可以手工生成UTF-16BE->gb2312的代码页,存到一个unsigned short code_page[65536]的数组中。 code_page[wchar_utf-16be] = uchar_gb2312;
忘世麒麟 2016-04-29
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
推荐使用convertz软件。
WinExec("convertz /i:ube /o:gbk in.txt out.txt",SW_HIDE);
语法:convertz [CodeIn] <CodeOut> [Face] <FileIn> [FileOut]

[CodeIn]  输入编码 (可省略)

	参数	输入的编码方法
	----------------------------------------------
	/i:ule	Unicode Little Endian
	/i:ube	Unicode Big Endian
	/i:utf8	UTF-8
	/i:gbk	GBK
	/i:big5	Big5
	/i:jis	JIS (日文)
	/i:sjis	Shift-JIS (日文)
	/i:euc	EUC-JP (日文)

*在省略这参数的情况下,程式会自动侦测来源档案的编码。若果来源档案是 GBK 或 Big5 码,
建议当档案里面有多于100个中文字时才用这功能,否则程式可能会错误判断编码。

<CodeOut>  输出编码

	参数	输出的编码方法
	-----------------------------------------------
	/o:ule	Unicode Little Endian
	/o:ube	Unicode Big Endian
	/o:utf8	UTF-8
	/o:gbk	GBK
	/o:big5	Big5
	/o:jis	JIS (日文)
	/o:sjis	Shift-JIS (日文)
	/o:euc	EUC-JP (日文)

[Face]   输出字体,预设值是 /f:d (可省略)

	参数	输出的字型
	-----------------------------------------------
	/f:t	繁体字型 (Traditional)
	/f:s	简体字型 (Simplified)
	/f:d	直接转换不做词汇修正

	输入编码	输出编码	预设值
	--------------------------------------------------
	GBK	Big5		繁体
	Big5	GBK		简体
	其它的编码转换		不变(用回原本的字体)

* 若果输出编码是 Big5  /f:s 参数无效
* 若输入或输出编码是 jis/shift-jis/euc-jp,/f:s 及 /f:t 参数皆无效

<FileIn>   输入档案的路径+名称,支援万用字符

[FileOut] 输出档案的路径+名称,支援万用字符(可省略)

* 在 FileOut 省略的情况下,转码结果会覆写到 FileIn
* 若档案名称包含空白格,须要在档名的前后两端加入双引号 (")

例体:

1) 	convertz /i:big5 /o:ule /f:s test1.txt test2.txt

上述指令会将 test.txt 的内容由 Big5 转为简体中文的 Unicode-LE 编码并将结果储存到 test2.txt。

2) 	convertz /i:utf8 /o:big5 *.*

上述指令将当前目录的所有档案由 utf-8 转做 big5 码,输出结果会覆写原来的档案。

3) 	convertz /o:ule /f:t k*.txt "D:\Temp Dir\*.abc"

上述指令会搜寻当前目录内所有档名首个字母是 k 及副档名是 txt 的档案,自动侦测它们的原来编码,
然后逐一转换成为繁体 Unicode-LE, 并另存到 'D:\Temp Dir' 目录,新档案名称跟原来档案相同但副档名会改做 abc。
引用 3 楼 CharlesSimonyi 的回复:
C++11标准库提供了对UTF-16 LE、UTF-16 BE、UTF-8、UTF-32的支持,可以使它们之间相互转换。 参考:http://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11 至于转换成GB2312还需借助第三方库(比如libiconv)或系统提供的API(比如Windows的WideCharToMultiByte)
引用 2 楼 lm_whales 的回复:
如果是文件,只需要文件有个标志就可以了 如果使自己处理 确实需要转换一下
完成了,用我考虑到的比较恶心的方式,硬是弄出来了
encoderlee 版主 2016-04-29
  • 打赏
  • 举报
回复
C++11标准库提供了对UTF-16 LE、UTF-16 BE、UTF-8、UTF-32的支持,可以使它们之间相互转换。
参考:http://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11
至于转换成GB2312还需借助第三方库(比如libiconv)或系统提供的API(比如Windows的WideCharToMultiByte)

64,651

社区成员

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

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