找回密码
 加入
搜索
查看: 319|回复: 16

[AU3基础] [已解决]请教:如何根据区位码得到汉字字符?

[复制链接]
发表于 2023-12-31 22:12:36 | 显示全部楼层 |阅读模式
本帖最后由 hnfeng 于 2024-1-1 08:50 编辑

请教:如何根据区位码得到汉字字符?

例如 输入 0908 得到
没搜到有此 UDF
请高手们帮忙
谢谢
发表于 2023-12-31 22:58:58 | 显示全部楼层
本帖最后由 afan 于 2023-12-31 23:16 编辑

Local $code = '0908'
MsgBox(0, $code, _GB2Str($code))

Func _GB2Str($sCode)
        Local $aSp = StringRegExp($sCode, '^(\w\w)(\w\w)$', 1)
        If @error Then Return SetError(1, 0, '')
        Return BinaryToString('0x' & Hex($aSp[0] + 160, 2) & Hex($aSp[1] + 160, 2))
EndFunc   ;==>_GB2Str
发表于 2024-1-1 01:42:56 | 显示全部楼层

我只会用简单的ChrW
 楼主| 发表于 2024-1-1 08:49:31 | 显示全部楼层

多谢多谢,A大太厉害了
发表于 2024-1-1 10:02:50 | 显示全部楼层
lpxx 发表于 2024-1-1 01:42
我只会用简单的ChrW

关键是 ChrW 不行,需要先把它掰开来一段加减法……
发表于 2024-1-1 10:21:59 | 显示全部楼层
hnfeng 发表于 2024-1-1 08:49
多谢多谢,A大太厉害了

没用过区位码,百度了一下区位码的定义临时写的
发表于 2024-1-1 21:21:20 | 显示全部楼层
本帖最后由 qq413774005 于 2024-1-1 21:22 编辑

#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=C:\Windows\system32\SHELL32.dll|-210
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Comment=汉字区位码转换
#AutoIt3Wrapper_Res_Description=汉字区位码转换
#AutoIt3Wrapper_Res_Fileversion=1.1.0.0
#AutoIt3Wrapper_Res_LegalCopyright=汉字区位码转换
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseX64=n
#PRE_Res_requestedExecutionLevel=None
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <String.au3>
Opt("GUIOnEventMode", 1)
$TXT_1 = "1234567890KV" & @CRLF & "ABCDEFGHIGKLMNOPQISTUVWXYZ" & @CRLF & "电容器室" & @CRLF & "二次室" & @CRLF & "GIS室" & @CRLF & "主控室" & @CRLF & "开关室" & @CRLF
$TXT_2 = "电缆沟层" & @CRLF & "电容器室" & @CRLF & "工具间" & @CRLF & "蓄电池室" & @CRLF & "走廊" & @CRLF & "门卫室" & @CRLF & "仪表室" & @CRLF & "东南西北" & @CRLF & "上下左右" & @CRLF
#region ### START Koda GUI section ###
$Form1 = GUICreate("汉字区位码转换器V1.1", 700, 300, @DesktopWidth / 2-350 , @DesktopHeight / 2-150 )
GUISetOnEvent($GUI_EVENT_CLOSE, "Click2close")
$Edit1 = GUICtrlCreateEdit("", 8, 8, 210, 280, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
GUICtrlSetData(-1, $TXT_1 & $TXT_2)
$Edit2 = GUICtrlCreateEdit("", 325, 8, 370, 280, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
GUICtrlSetFont(-1, 10)
$Button1 = GUICtrlCreateButton(">> 转换 >>", 230, 150, 85, 25, $BS_CENTER)
GUICtrlSetOnEvent(-1, "Button1Click")
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

Func Click2close()
        Exit
EndFunc   ;==>Click2close

While 1
        Sleep(100)
WEnd

Func Button1Click();汉字区位码
        Local $string = GUICtrlRead($Edit1)
        Local $newstr = ""
        For $i = 1 To StringLen($string)
                $newstr = $newstr & getqw(StringMid($string, $i, 1))
        Next
        $string = $newstr
        GUICtrlSetData($Edit2, $string)
EndFunc   ;==>Button1Click

Func getqw($ch)
        $casc = Dec(_StringToHex($ch))
        If $casc < 0 Then
                $casc = $casc + 65535 + 1
        ElseIf $casc > 255 Then
                $casc = Hex($casc, 4)
                $b1 = StringRight(StringFormat("00%d%d", Dec(StringLeft($casc, 2)) - 160), 2)
                $b2 = StringRight(StringFormat("00%d%d", Dec(StringRight($casc, 2)) - 160), 2)
                $return = $ch & $b1 & $b2 & " "
                Return $return
        Else
                Return $ch
        EndIf
EndFunc   ;==>getqw

 楼主| 发表于 2024-1-2 08:55:47 | 显示全部楼层
afan 发表于 2024-1-1 10:21
没用过区位码,百度了一下区位码的定义临时写的

我本想列出汉字的特殊符号,但是现在发现区位码貌似只支持GB2312里面的字符,许多许多的字符不在GB2312里面,也就无法使用区位码列出了。

有没有能支持大字符集(GBK?)的UDF ?
 楼主| 发表于 2024-1-2 09:47:24 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2024-1-2 10:25:57 | 显示全部楼层

不清楚,不过我测试你表中的第一个和最后一个都是有的

_GB2Str('0148')
---------------------------
0148

_GB2Str('0969')
---------------------------
0969

 楼主| 发表于 2024-1-2 11:27:47 | 显示全部楼层
afan 发表于 2024-1-2 10:25
不清楚,不过我测试你表中的第一个和最后一个都是有的

_GB2Str('0148')

这个图就是使用您的UDF做出来的,谢谢。

许多特殊字符不在GB2312里面,貌似也就不能使用区位码显示出来,
例如: ░  ▒  ▓  ▏  ▎  ▍  ▌  ▋  ▊  ▉  █  等等

https://blog.csdn.net/weixin_43452154/article/details/132236623
https://www.ip138.com/teshufuhao/

用Alt+数字可以输入,例如
alt+43144  ▓
alt+43139  ▋
alt+43337  ㊣
发表于 2024-1-2 11:57:28 | 显示全部楼层
hnfeng 发表于 2024-1-2 11:27
这个图就是使用您的UDF做出来的,谢谢。

许多特殊字符不在GB2312里面,貌似也就不能使用区位码显示出来 ...

那应该就没办法用区位码表示了,超出范围了。另外,可以修改一下,对超出范围的做出错误返回
Func _GB2Str($sCode)
        Local $aSp = StringRegExp($sCode, '^(\d\d)(\d\d)$', 1)
        If @error Then Return SetError(1, 0, '')
        If Number($aSp[0]) < 1 Or Number($aSp[0]) > 94 Then Return SetError(2, 0, '')
        If Number($aSp[1]) < 1 Or Number($aSp[1]) > 94 Then Return SetError(2, 0, '')
        Return BinaryToString('0x' & Hex($aSp[0] + 160, 2) & Hex($aSp[1] + 160, 2))
EndFunc   ;==>_GB2Str
 楼主| 发表于 2024-1-2 13:35:11 | 显示全部楼层
afan 发表于 2024-1-2 11:57
那应该就没办法用区位码表示了,超出范围了。另外,可以修改一下,对超出范围的做出错误返回
Func _GB2St ...

谢谢您的帮助
 楼主| 发表于 2024-1-2 20:37:44 | 显示全部楼层
afan 发表于 2024-1-2 11:57
那应该就没办法用区位码表示了,超出范围了。另外,可以修改一下,对超出范围的做出错误返回
Func _GB2St ...

区位码 有效的区 是 1-9, 16-87
所以
If Number($aSp[0]) < 1 Or Number($aSp[0]) > 94 Then Return SetError(2, 0, '')
这一行仍然需要完善为
If Number($aSp[0]) < 1 Or Number($aSp[0]) > 87 Then Return SetError(2, 0, '')
If Number($aSp[0]) > 9 And Number($aSp[0]) < 16 Then Return SetError(2, 0, '')
发表于 2024-1-2 20:51:33 | 显示全部楼层
hnfeng 发表于 2024-1-2 20:37
区位码 有效的区 是 1-9, 16-87
所以
If Number($aSp[0]) < 1 Or Number($aSp[0]) > 94 Then Return Set ...

不是吧…… 你上面贴图 位码 都到了94,图中区码虽然只到了09,但应该一样可以到 94 的。
百度资料:GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位置。所以它的区位码范围是:0101-9494
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 07:33 , Processed in 0.080345 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表