标题: [原创]GBK & UTF8 编码互转脚本 (CMD+GAWK)
[打印本页]
作者: 无奈何
时间: 2006-11-30 00:31
标题: [原创]GBK & UTF8 编码互转脚本 (CMD+GAWK)
GBK & UTF8 编码互转脚本 (CMD+GAWK)
因为我的实际应用中需要 UTF8 到 GBK 的编码转换,所以就用 GAWK 写了一个,事实上在我早先的帖子中已经在使用。这次整理了一下,已支持编码的双向转换,自己制作了完整的 GBK 到 UTF8 的转码对照表,制作中发现系统的转码结果和 iconv 的转码结果有不少差异,对照表采用的是前者。
本脚本支持管道和文件的编码转换,结果输出到屏幕。现在参数支持不多,但是有参数完整性的检测功能,可以完成多参数的无序调用。采用了新的脚本释放方法,源文件有改动时会自动更新脚本。还有错误消息和依赖文件完整性检查机制。希望这些小技巧对大家编写批处理有所帮助。
GAWK 下载链接:
http://www.klabaster.com/progs/gawk32.zip
脚本及转码表见附件。
Quote: |
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :: gbk2utf8.cmd -V0.1 -- GBK & UTF8 编码互转
- :: 无奈何@cn-dos.net - 2006-11-28 - CMD & GAWK
- :: 用法:gbk2utf8 /I file...
- :: 支持文件: - gawk.exe gbk2utf8.dat
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- @echo off
- setlocal
- set self="%~f0"
- set AwkScript="%temp%\%~n0%~z0.awk"
- set path=%path%;%~dp0;%cd%
- set nofile=
- set error=
- set input=
- ::依赖文件完整性检查
- for %%i in (gawk.exe gbk2utf8.dat) do (
- @if "%%~$PATH:i" == "" (
- echo.程序所依赖文件 "%%i" 缺失。
- set nofile=1
- ) else ( set %%~ni="%%~$PATH:i" )
- )
- if defined nofile goto :EOF
- ::文件改动后更新脚本
- if not exist %AwkScript% (
- del /q "%temp%\%~n0*.awk" 2>nul
- gawk "/^#<-1/,/^#>-1/{if(!/^#/)print}" %self% >%AwkScript%
- )
- :ParseLoop
- if "%~1" == "" goto Start
- if "%~1" == "?" goto SwitchH
- if "%~1" == "/?" goto SwitchH
- rem 参数处理并转到相应标签。
- for %%s in (U u I i h H) do if "%~1"=="/%%s" goto Switch%%s
- if "%F_input%" == "1" (
- if not exist "%~1" set error=警告:文件 "%~1" 不存在。 & goto error
- set input=%input% "%~1"
- shift
- goto ParseLoop
- )
- if "%F_input%" == "-1" shift & goto ParseLoop
- set error=错误: 参数格式不正确 - "%1" !
- goto error
- :SwitchI
- set F_input=1
- if "%~2" == "-" set F_input=-1
- shift
- goto ParseLoop
- :SwitchU
- set F=-1
- shift
- goto ParseLoop
- :error
- echo.%error%
- echo.
- :SwitchH
- echo.gbk2utf8 V0.1 -- GBK ^& UTF8 编码互转
- echo.
- echo.用法:1、%~n0 [/U]
- echo. 2、%~n0 [/U] /I file...
- echo. 3、%~n0 [/U] /I -
- echo.
- echo.选项: /? 显示本简短帮助,等价命令 /H 。
- echo. /U UTF8 转码为 GBK ,默认设置为 GBK 转码为 UTF8 。
- echo. /I 指定转换文件,“-”号从标准输出获得。
- echo. 本参数可以空缺,缺省将从标准输出获得。
- echo. 指定转换文件时,/I 参数不可省略。
- goto :EOF
- :Start
- if "%input%" == "" set F_input=-1
- if "%F_input%" == "-1" (
- gawk -v F=%F% -f %AwkScript%
- ) else (
- gawk -v F=%F% -f %AwkScript% %input%
- )
- goto :EOF
- :AwkScript
- #<-1
- function gbk2utf8(string,flag, reg, gbkreg, utf8reg, char, result){
- gbkreg="[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]"
- utf8reg="[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]"
- reg=gbkreg
- if (flag==-1)
- reg=utf8reg
- RLENGTH = 1
- while(RLENGTH != -1){
- match(string,reg)
- char=substr(string,RSTART,RLENGTH)
- if (RLENGTH>1)
- char=charset[char]
- result=result char
- string=substr(string,RSTART+RLENGTH)
- }
- return result
- }
- BEGIN {
- FS=","
- if (!F) F=1
- if (F==1) {
- while((getline<"gbk2utf8.dat") > 0)
- charset[$1]=$2
- }
- else{
- while((getline<"gbk2utf8.dat") > 0)
- charset[$2]=$1
- }
- close("gbk2utf8.dat")
- }
- {
- x=gbk2utf8($0,F)
- print x
- }
- #>-1
- goto :EOF
无奈何发表于 2006-11-30 01:02 |
|
[
Last edited by 无奈何 on 2006-11-30 at 02:04 PM ]
附件
1: gbk2utf8.zip (2006-11-30 14:06, 102.8 K, 下载附件所需积分 1点
,下载次数: 259)
作者: ccwan
时间: 2006-11-30 00:38
强贴留名。(electronixtar兄莫怪侵权^_^)
无奈何兄是我永不能翻越的高山啊!
作者: zh159
时间: 2006-11-30 00:42
以前我在网上找到一个 GBK-Unicode 的编码对照表(7k多对照字符),自己用批处理计算生成了 GBK-UTF-8 编码对照表,只要用查字典的 for 方式,就可以瞬间提取 UTF-8 编码,先找找看...
作者: vkill
时间: 2006-11-30 00:46
哎,gawk那段还是看不懂,学习中
作者: redtek
时间: 2006-11-30 00:48
太精彩了~~~
作者: 无奈何
时间: 2006-11-30 00:51
ccwan 兄过谦了,我也不是高手。
zxcv 兄,7k 多的是 GB2312 的,完整 GBK 有 2w 多,共 22046 个码位。
作者: 无奈何
时间: 2006-11-30 00:58
RE vkill
GAWK 支持多字节编码,这种处理方法的好处是只要编写匹配编码的正则表达式就可通用于其他其他编码的转换。应该说也是比较好理解的,唯一做的就是获取字符长度并截取。
作者: zh159
时间: 2006-11-30 01:52
Quote: |
Originally posted by 无奈何 at 2006-11-29 12:51:
ccwan 兄过谦了,我也不是高手。
zxcv 兄,7k 多的是 GB2312 的,完整 GBK 有 2w 多,共 22046 个码位。 |
|
确实如此,看来得找一个完整 GBK 的算一个 GBK-UTF-8 对照表了
作者: zh159
时间: 2006-11-30 02:21
已经获得了完整的 gbk2utf8 编码库
发现这个gbk2utf8编码库和我转换的 GB 版有很多数据不同:
例:
gbk2utf8
Quote: |
A1A42C C2B7
A1A52C CB89
A1A62C CB87
A1A72C C2A8 |
|
红色部分是gbk的识别
gb2utf8
Quote: |
a1a4 E383BB
a1a5 E08B89
a1a6 E08B87
a1a7 E082A8 |
|
好像这个gbk2utf8编码库GB部分的部分编码对照有误,超出库GB部分的编码暂时未发现错误
作者: 无奈何
时间: 2006-11-30 03:45
RE zxcv
我的那个中间加了分隔符 “,” 也就是 0X2C 。
给你一段我写的生成 GBK 所有字符的 AWK 脚本。自己另存为 UTF8 就可以获得两个编码的对照表了。
BEGIN{
#GBK/1: A1A1-A9FE 图形符号区GB 2312 非汉字符号区
for (i=0xa1;i<=0xa9;i++)
for (j=0xa1;j<=0xfe;j++)
if (j!=0x7f) printf("%c%c\n",i,j)
#GBK/2: B0A1-F7FE 汉字区GB 2312 汉字区
for (i=0xb0;i<=0xf7;i++)
for (j=0xa1;j<=0xfe;j++)
if (j!=0x7f) printf("%c%c\n",i,j)
#GBK/3: 8140-A0FE 汉字区
for (i=0x81;i<=0xa0;i++)
for (j=0x40;j<=0xfe;j++)
if (j!=0x7f) printf("%c%c\n",i,j)
#GBK/4: AA40-FEA0 汉字区
for (i=0xaa;i<=0xfe;i++)
for (j=0x40;j<=0xa0;j++)
if (j!=0x7f) printf("%c%c\n",i,j)
#GBK/5: A840-A9A0 图形符号区
for (i=0xa8;i<=0xa9;i++)
for (j=0x40;j<=0xa0;j++)
if (j!=0x7f) printf("%c%c\n",i,j)
}
[
Last edited by 无奈何 on 2006-11-30 at 03:50 AM ]
作者: zh159
时间: 2006-11-30 04:23
GB部分的编码只剩下面的找不到对应的
Quote: |
A8BB C991
A8BD C584
A8BE C588
A8C0 C9A1 |
|
先试试了^_^
作者: electronixtar
时间: 2006-11-30 07:01
没看懂,顶一个先
作者: HUNRYBECKY
时间: 2006-12-3 02:56
太高深了。学习中。
作者: tao0610
时间: 2006-12-3 02:59
好像是C++
作者: redtek
时间: 2006-12-3 09:31
GAWK真是强大啊~~~
作者: kk2008
时间: 2006-12-10 07:29
收藏了再说!
作者: hxuan999
时间: 2007-1-18 06:39
我也是..
作者: Jneny
时间: 2007-2-1 09:48
顶下好加分
作者: 163lom
时间: 2007-2-10 18:52
收下了,无敌佩服中……
作者: tuxueqing
时间: 2007-4-11 15:03
标题: 希望能下来看看
希望能下来看看
作者: vrix
时间: 2007-8-16 13:56
标题: 想要GBK字库
如果有生成字库的程序,那就更好。
作者: iamfoolberg
时间: 2007-11-13 23:12
顶一个,我还不能下啊
作者: iamfoolberg
时间: 2007-11-13 23:13
顶一个,我还不能下啊
作者: threemonk
时间: 2008-4-5 12:11
very good
作者: nn16300
时间: 2008-8-20 19:38
太高深了。学习中
作者: nn16300
时间: 2008-8-20 19:38
标题: 太高深了。学习中
太高深了。学习中
作者: xahstar
时间: 2008-9-7 14:39
向楼主学习!
作者: lotus516
时间: 2008-10-1 23:53
强贴留名
作者: kwl01skz
时间: 2009-2-18 18:20
标题: 它说:
它说:
Quote: |
Originally posted by cmd&gawk at D:\1\5>gbk2utf8.cmd /u /i c.txt
gawk: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\gbk2utf82891.awk:9: (FILENAME=c.txt FNR
=1) fatal: Unmatched [ or [^: /[-]|[?遌[€-縘|郲?縘[€-縘|[?颹[€-縘[€-縘|餥?縘[€
-縘[€-縘|[?鱙[€-縘[€-縘[€-縘/
|
|
请问这是什么意思?
[
Last edited by kwl01skz on 2009-2-21 at 03:28 ]
作者: nfwolf
时间: 2010-1-20 09:37
可不可以不用GAWK 啊
作者: nfwolf
时间: 2010-1-20 09:43
如何使用呢?
作者: nfwolf
时间: 2010-1-20 09:56
没有办法使用,郁闷