Board logo

标题: [游戏娱乐] 纯批处理版汉字转点阵 [打印本页]

作者: foxJL    时间: 2009-11-16 01:43     标题: 纯批处理版汉字转点阵

使用了UCDOS的HZK16字库,我已经打包上传,请大家下载附件使用。
13-09-21:WIN7下输出空格出错,更改了默认的前景和背景字符
  1. ::只支持简体汉字,如果输入其它字符,转换结果将会出现错误。
  2. ::一次最多只能转换四个汉字,如多于四个则取前四个。
  3. ::09-11-18:同时支持最多四个汉字的转换,并且横向输出。
  4. ::09-11-18:删去了对汉字区位码、机内码、字模的显示。
  5. ::09-11-18:添加了前景及背景字符的设定。注意,设置时请统一前景及背景字符的字节数。
  6. @echo off&setlocal EnableDelayedExpansion&cls
  7. mode con: cols=129 lines=27
  8. title code by foxj @ bbs.bathome.cn
  9. if not exist hzk16 (echo.无法找到HZK16字库文件。请把HZK16与此脚本放至同一目录下。&pause>nul&exit)
  10. :start
  11. cls
  12. set /p HZ=输入所要转换的汉字(最多四个):
  13. if "%hz%"=="" (echo 请重新输入,按任意键返回。& pause>nul&goto start)
  14. set /p Qj=设置前景字符(默认为█):
  15. if "%Qj%"=="" set qj=█
  16. set /p Bj=设置背景字符(默认为□):
  17. if "%Bj%"=="" (set bj=□)
  18. set hz=%hz: =%
  19. set hz=%hz:~0,4%
  20. set hznum=0
  21. for /l %%i in (0,1,3) do (if not "!hz:~%%i,1!"=="" (set /a hznum+=1))
  22. set /a hznum-=1
  23. for /l %%d in (0,1,%hznum%) do (
  24. call :bin !hz:~%%d,1!
  25. set bin_2=!bin_2:0=%BJ%!
  26. set bin_2=!bin_2:1=%QJ%!
  27. set bin%%d=!bin_2!
  28. )
  29. ::输出点阵字体
  30. echo.&for /l %%i in (1,1,64) do (set/p=━<nul)
  31. echo.&echo.
  32. for /l %%i in (1,1,16) do (
  33. for /l %%j in (0,1,%hznum%) do (call set /p=%%bin%%j:~!n!,16%%<nul)
  34. set /a n=%%i*16
  35. echo.)
  36. echo.&for /l %%i in (1,1,64) do (set/p=━<nul)
  37. ::echo.完成,按任意键重新开始。
  38. pause>nul&goto start
  39. :bin
  40. ::计算文字区位码
  41. (set hzqwm=)
  42. for /f "delims=" %%i in ('findstr "%1" HZK16') do (
  43. for %%j in (%%i) do (
  44. set hzqwm=%%j&set hzqwm=!hzqwm:^(=!&set hzqwm=!hzqwm:^)=!&set hzqwm=!hzqwm:%1=!
  45. set /a 3/!hzqwm!>nul 2>nul && set qwm=!hzqwm!
  46. )
  47. )
  48. if "%hzqwm%"=="" echo.“%1”不在转换字符集,无法完成转换。& (set hzqwm=nosw) & goto :eof
  49. call :nxn "%qwm:~0,2%" qwm_1 10 16
  50. call :nxn "%qwm:~2,4%" qwm_2 10 16
  51. set qwm_3=0000%qwm_1%
  52. set qwm_4=0000%qwm_2%
  53. set qwm_1=%qwm_3:~-2%%qwm_4:~-2%
  54. call :nxn "%qwm_1%" qwm_2 16 10
  55. ::计算文字机内码
  56. set /a jlm_1=qwm_2+8224+32896
  57. call :nxn "%jlm_1%" jlm_2 10 16
  58. ::计算文字在字库中的偏移量
  59. call :nxn "%jlm_2:~0,2%" py_1 16 10
  60. call :nxn "%jlm_2:~2,4%" py_2 16 10
  61. set /a py_q=py_1-161,py_w=py_2-161
  62. set /a py=(py_q*94+py_w)*2-1
  63. set /a py2=py+1
  64. ::查找字节编码
  65. set na=0
  66. ::echo. "%1"的区位码:%qwm%,内码:%jlm_2%
  67. for /l %%a in (!py!,1,!py2!) do (
  68. for /f "delims=" %%i in ('findstr /n .* hzk16 ^| findstr "%%a:"') do (
  69. set "var1=%%i" & call set var1=%%var1:*:=%%
  70. set /a na+=1
  71. set na!na!=!var1!
  72. )
  73. )
  74. if %na% GTR 2 (set var2=!na1! !na3!) else (set var2=!na1! !na2!)
  75. (set bin_1=) & (set bin_2=)
  76. for %%j in (!var2!) do (
  77. call :nxn "%%j" bin 16 2
  78. set bin_1=00000000!bin!
  79. set bin_2=!bin_2!!bin_1:~-8!
  80. )
  81. goto :eof
  82. ::任意进制数互换,code by 随风
  83. :nXn 任意进制互转 @随风 @bbs.bathome.cn(封装)
  84. @echo off&setlocal enabledelayedexpansion
  85. if "%~4"=="" (set /a q=10,h=2)else (set /a q=%~3,h=%~4)
  86. set "str=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  87. for /l %%a in (0 1 35)do set .%%a=!str:~%%a,1!&set ".!str:~%%a,1!=%%a"
  88. set sun=&set jie=&set "var=%~1"&set /a nnn=1,num=0
  89. for /l %%a in (0 1 100) do (
  90. if not "!var:~%%a,1!"=="" (call set sun=%%.!var:~%%a,1!%% !sun!))
  91. for %%a in (!sun!) do set /a num=%%a*nnn+num,nnn*=q
  92. :10进制转n进制
  93. set /a yu=num%%h,num/=h
  94. set "jie=!.%yu%!!jie!"&if !num! gtr 0 goto 10进制转n进制
  95. endlocal&set %~2=%jie%&goto :EOF
复制代码
链接: https://pan.baidu.com/s/1Pq1_AFPTgFQxXJ9ZYc2I4Q 提取码: 67rk
作者: zjw767676    时间: 2009-11-16 18:15

如何在CMD窗口中更改输入法呢?
作者: foxJL    时间: 2009-11-16 22:31

与平时一样,CTRL+SHIFT就可以转换。
----------
先前的回复是错误的,经9楼 523066680 提醒应该是alt+shift切换输入。

[ 本帖最后由 foxJL 于 2010-7-8 18:49 编辑 ]
作者: yslyxqysl    时间: 2009-11-17 09:18

强大的文本处理...
不过好像没有判错...
另:某些系统的cmd不支持Ctrl+Shift切换输入法
请点击输入法按钮切换。

[ 本帖最后由 yslyxqysl 于 2009-11-17 09:24 编辑 ]
作者: foxJL    时间: 2009-11-17 12:26

还没有做错误处理,留待有空更新再做处理。
作者: sl543001    时间: 2009-11-17 13:30     标题: 有创意

有创意,继续努力,相信会做的更好!
作者: foxJL    时间: 2010-7-6 18:45

很是失望呀。为什么这个鲜有人关注?
作者: 523066680    时间: 2010-7-7 21:21     标题: 回复 7楼 的帖子

错过了…
看你顶起来才看到。  支持!
==================
测试了, 看来也可以搞个英文字母的嘛。
可能点阵比较大,中间过程比较久。

[ 本帖最后由 523066680 于 2010-7-7 21:25 编辑 ]
作者: 523066680    时间: 2010-7-7 21:29     标题: 回复 3楼 的帖子

对了 我这里测试  命令行是alt+shift 切换输入,在很多电脑都试过的。

[ 本帖最后由 523066680 于 2010-7-7 21:32 编辑 ]
作者: foxJL    时间: 2010-7-8 19:04     标题: 回复 8楼 的帖子

回8楼的朋友:
当初在写的时候就想到过同时转换字母,但是苦于找不到字母在字库中的分区,因此只好作罢。

慢的原因到不是因为点阵比较大,而是由于批处理文本查找的速度太慢,另外加上一系列复杂的进制转换,所以速度慢得确实是难以忍受。

比如照同时转换四个字的速度计算:
要用到8次findstr(一个汉字得2次查找)+28次(一个汉字得7次)call调用随风大哥的进制转换函数。
如果一次转换一个汉字的话那速度就要快很多了。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2