hnfeng 发表于 2023-12-31 22:12:36

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

本帖最后由 hnfeng 于 2024-1-1 08:50 编辑

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

例如 输入 0908 得到 ┄
没搜到有此 UDF
请高手们帮忙
谢谢

afan 发表于 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 + 160, 2) & Hex($aSp + 160, 2))
EndFunc   ;==>_GB2Str

lpxx 发表于 2024-1-1 01:42:56

afan 发表于 2023-12-31 22:58


:face (1):我只会用简单的ChrW :face (1):

hnfeng 发表于 2024-1-1 08:49:31

afan 发表于 2023-12-31 22:58


多谢多谢,A大太厉害了

afan 发表于 2024-1-1 10:02:50

lpxx 发表于 2024-1-1 01:42
我只会用简单的ChrW

关键是 ChrW 不行,需要先把它掰开来一段加减法…… {:1_628:}

afan 发表于 2024-1-1 10:21:59

hnfeng 发表于 2024-1-1 08:49
多谢多谢,A大太厉害了

没用过区位码,百度了一下区位码的定义临时写的 {:1_628:}

qq413774005 发表于 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

hnfeng 发表于 2024-1-2 08:55:47

afan 发表于 2024-1-1 10:21
没用过区位码,百度了一下区位码的定义临时写的

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

有没有能支持大字符集(GBK?)的UDF ?

hnfeng 发表于 2024-1-2 09:47:24


afan 发表于 2024-1-2 10:25:57

hnfeng 发表于 2024-1-2 09:47


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

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

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

hnfeng 发表于 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㊣

afan 发表于 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) < 1 Or Number($aSp) > 94 Then Return SetError(2, 0, '')
        If Number($aSp) < 1 Or Number($aSp) > 94 Then Return SetError(2, 0, '')
        Return BinaryToString('0x' & Hex($aSp + 160, 2) & Hex($aSp + 160, 2))
EndFunc   ;==>_GB2Str

hnfeng 发表于 2024-1-2 13:35:11

afan 发表于 2024-1-2 11:57
那应该就没办法用区位码表示了,超出范围了。另外,可以修改一下,对超出范围的做出错误返回
Func _GB2St ...

谢谢您的帮助

hnfeng 发表于 2024-1-2 20:37:44

afan 发表于 2024-1-2 11:57
那应该就没办法用区位码表示了,超出范围了。另外,可以修改一下,对超出范围的做出错误返回
Func _GB2St ...

区位码 有效的区 是 1-9, 16-87
所以
If Number($aSp) < 1 Or Number($aSp) > 94 Then Return SetError(2, 0, '')
这一行仍然需要完善为
If Number($aSp) < 1 Or Number($aSp) > 87 Then Return SetError(2, 0, '')
If Number($aSp) > 9 And Number($aSp) < 16 Then Return SetError(2, 0, '')

afan 发表于 2024-1-2 20:51:33

hnfeng 发表于 2024-1-2 20:37
区位码 有效的区 是 1-9, 16-87
所以
If Number($aSp) < 1 Or Number($aSp) > 94 Then Return Set ...

不是吧…… 你上面贴图 位码 都到了94,图中区码虽然只到了09,但应该一样可以到 94 的。
百度资料:GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位置。所以它的区位码范围是:0101-9494
页: [1] 2
查看完整版本: [已解决]请教:如何根据区位码得到汉字字符?