Board logo

标题: AHK文本编辑器显示中文有乱码 [打印本页]

作者: 小白龙    时间: 2023-3-31 20:20     标题: AHK文本编辑器显示中文有乱码

本帖最后由 小白龙 于 2023-3-31 20:25 编辑

在国外找到一个AHK脚本, 脚本中包装了一个流行的文本编辑器scintilla的代码, 它可以高亮显示代码文本, 还可以高亮显示要查找的文本, 唯一不足的是中文结尾会有乱码, 我修改过, 改之前中文完全乱码, 改之后,是中文结尾有乱码

如果装了AHK, 直接双击脚本就行, 没有安装AHK, 就按图片中的演示, 拖到AHK上就可以

虽然很多文本编辑器都有这些功能, 但是这个可玩性很强, 而且很小

求助路过的精通AHK的大佬看看
https://t.wss.ink/f/auxqujdd150 复制链接到浏览器打开


作者: Five66    时间: 2023-3-31 21:16

试试编码保存成unicode
作者: 小白龙    时间: 2023-3-31 21:28

本帖最后由 小白龙 于 2023-3-31 21:30 编辑

回复 2# Five66


    试过了, 只有utf8能显示中文
感觉有可能是版本太低了, 大佬能帮忙编译一下新版的dll吗? 我没有装VS
下面是新版本的链接
https://master.dl.sourceforge.ne ... illa446.zip?viasf=1

网上找到的编译说明: 上面AHK的包装器只支持32位的,所以要编译成32位DLL
1.下载Scintilla的源代码。
2.下载后解压,我是直接解压,这里我解压在E:\
3.在Vs2019下编译
4.我是编译成32位,我选择的是 x86 Native Tools Command Prompt for VS 2019
5.命令行内进入Scintilla的文件夹内
    cd scintilla\win32
6.清理工程 (第一次编译的可以不用清理,如果是重复编译了,就需要先清理过再编译,不然就要出错)
    nmake -f scintilla.mak clean
7.编译
nmake -f scintilla.mak
编译完成后,在bin目录里会得到Scintilla.dll和SciLexer.dll文件
SciLexer.dll是包含了语法解析器(Lexer)的Scintilla控件,一般来说我们只要用它就可以了
作者: Five66    时间: 2023-3-31 21:46

回复 3# 小白龙

test.txt gbk编码应该行吧
2advancedhighlight.ahk  中的第22行好像是编码设置
1Highlight.ahk 好像用的 SCI.ahk 里的设置(第511行)
不过不清楚怎么设置
作者: Five66    时间: 2023-3-31 21:53

回复 4# Five66

哦,找到了 1Highlight.ahk 的编码设置在177行

试试将编码设置里的SC_CHARSET_GB2312 改成  SCI.ahk 里513行 那里说明的编码
作者: jyswjjgdwtdtj    时间: 2023-3-31 22:52

说句题外话 图床不要用imgbb,如果没有他的cookie 会显示缩略图的
可以用imgse图床
作者: 小白龙    时间: 2023-4-1 08:17

本帖最后由 小白龙 于 2023-4-1 08:19 编辑

回复 5# Five66


感谢大佬指导,
177行的编码代码是我加的, 原来没有, 中文全是乱码, 加上后, 好些了, 只是空格后有乱码

感觉应该是老版的DLL兼容性差, 估计新版的DLL应该可以

路过的装有VS的大佬, 帮忙编辑一下#3楼的新版的32位的DLL就太感谢了
作者: 小白龙    时间: 2023-4-1 08:21

回复 6# jyswjjgdwtdtj

感谢提醒, 以后试试, 一直用ibb的, 确实预览有问题
作者: 小白龙    时间: 2023-4-2 20:05

本帖最后由 小白龙 于 2023-4-2 20:09 编辑

我自己编译了新版本也不行, 看来是包装代码的问题了

52-58行的代码, 好像这里要设置

            (wParam && !(wParam+0) && !isObject(wParam)) ? (VarSetCapacity(wParamA, StrPut(wParam, "CP0"))
                                                           ,StrPut(wParam, &wParamA, "CP0")
                                                           ,wParam:=&wParamA) : null

            (lParam && !(lParam+0) && !isObject(lParam)) ? (VarSetCapacity(lParamA, StrPut(lParam, "CP0"))
                                                           ,StrPut(lParam, &lParamA, "CP0")
                                                           ,lParam:=&lParamA) : null


第85行的代码,也得设置
            buf ? (lParam := StrGet((msg = "GetTextRange") ? blParam : &lParam, "CP0"), buf:=false) : null ; convert the text from ANSI
  1. ; Title: Scintilla Wrapper for AHK
  2. class scintilla {
  3.     hwnd            := 0        ; Component Handle
  4.     notify          := ""       ; Name of the function that will handle the window messages sent by the control
  5.                                 ; Messages which set this variables.
  6.                                 ; ---------------------------------------------------------------------------------------------------------------
  7.     idFrom          := 0        ; The handle from which the notification was sent
  8.     scnCode         := 0        ; The SCN_* notification code
  9.     position        := 0        ; SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK
  10.                                 ; SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK
  11.                                 ; SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK
  12.                                 ; SCN_INDICATORCLICK, SCN_INDICATORRELEASE
  13.                                 ; SCN_USERLISTSELECTION, SCN_AUTOCSELECTION
  14.     ch              := 0        ; SCN_CHARADDED, SCN_KEY
  15.     modifiers       := 0        ; SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
  16.                                 ; SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE
  17.     modType         := 0        ; SCN_MODIFIED
  18.     text            := 0        ; SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_URIDROPPED
  19.     length          := 0        ; SCN_MODIFIED
  20.     linesAdded      := 0        ; SCN_MODIFIED
  21.     macMessage      := 0        ; SCN_MACRORECORD
  22.     macwParam       := 0        ; SCN_MACRORECORD
  23.     maclParam       := 0        ; SCN_MACRORECORD
  24.     line            := 0        ; SCN_MODIFIED
  25.     foldLevelNow    := 0        ; SCN_MODIFIED
  26.     foldLevelPrev   := 0        ; SCN_MODIFIED
  27.     margin          := 0        ; SCN_MARGINCLICK
  28.     listType        := 0        ; SCN_USERLISTSELECTION
  29.     x               := 0        ; SCN_DWELLSTART, SCN_DWELLEND
  30.     y               := 0        ; SCN_DWELLSTART, SCN_DWELLEND
  31.     token           := 0        ; SCN_MODIFIED with SC_MOD_CONTAINER
  32.     annotLinesAdded := 0        ; SCN_MODIFIED with SC_MOD_CHANGEANNOTATION
  33.     updated         := false    ; SCN_UPDATEUI
  34.     __new(params*){
  35.         if (params.MaxIndex())
  36.             __SCI(this.hwnd := __Add(params*), this)
  37.         else
  38.             return this
  39.     }
  40.     __call(msg, ByRef wParam:=0, ByRef lParam:=0, params*){
  41.         if (msg = "Add")
  42.             __SCI(this.hwnd := __Add(wParam, lParam, params*), this)
  43.         else
  44.         {
  45.             (wParam && !(wParam+0) && !isObject(wParam)) ? (VarSetCapacity(wParamA, StrPut(wParam, "CP0"))
  46.                                                            ,StrPut(wParam, &wParamA, "CP0")
  47.                                                            ,wParam:=&wParamA) : null
  48.             (lParam && !(lParam+0) && !isObject(lParam)) ? (VarSetCapacity(lParamA, StrPut(lParam, "CP0"))
  49.                                                            ,StrPut(lParam, &lParamA, "CP0")
  50.                                                            ,lParam:=&lParamA) : null
  51.             /*
  52.               Special Operations
  53.               Due to the fact that some functions require the user to manually prepare bufferst to store text
  54.               I decided to make most of those operations internally to have cleaner code later on.
  55.             */
  56.             (msg = "GetText") ? (VarSetCapacity(lParam, wParam * (a_isunicode ? 2 : 1)+8), lParam := &lParam, buf:=true) : null
  57.             (msg = "GetLine") ? (VarSetCapacity(lParam, this.linelength(wParam)+1 * (a_isunicode ? 2 : 1)),lParam := &lParam, buf:=true) : null
  58.     (msg = "GetCurLine") ? (VarSetCapacity(lParam, this.linelength(wParam)+1 * (a_isunicode ? 2 : 1)), lParam := &lParam, buf:=true) : null
  59.             (msg = "GetTextRange") ? (range:=abs(wParam.1 - wParam.2)+1, dSize :=  __sendEditor(this.hwnd, "GetLength")
  60.                                      ,VarSetCapacity(lParam, range > dSize ? (dSize, wParam.2 := dSize) : range)
  61.                                      ,VarSetCapacity(textRange, 12, 0)
  62.                                      ,NumPut(wParam.1,textRange,0,"UInt")
  63.                                      ,NumPut(wParam.2,textRange,4,"UInt")
  64.                                      ,NumPut(&lParam,textRange,8,"UInt")
  65.                                      ,blParam := &lParam, wParam := false,lParam := &textRange, buf:=true) : null
  66.             __isHexColor(lParam, msg) ? lParam := (lParam & 0xFF) <<16 | (lParam & 0xFF00) | (lParam >>16) : null
  67.             __isHexColor(wParam, msg) ? wParam := (wParam & 0xFF) <<16 | (wParam & 0xFF00) | (wParam >>16) : null
  68.             res := __sendEditor(this.hwnd, msg, wParam, lParam)
  69.             ; Retrieve Text from buffer
  70.             ; I must switch lParam to another variable when using GetTextRange because lParam cant be overwriten
  71.             ; It has the pointer to the TextRange Structure
  72.             buf ? (lParam := StrGet((msg = "GetTextRange") ? blParam : &lParam, "CP0"), buf:=false) : null ; convert the text from ANSI
  73.             return res
  74.         }
  75.     }
  76. }
复制代码

作者: 小白龙    时间: 2023-4-2 20:31

本帖最后由 小白龙 于 2023-4-2 20:35 编辑

回复 5# Five66


    刚发现, 只要中文字是双数就可以显示正常,  只要出现奇数就会在单个字的地方出现乱码

找到个文章, 但是不知道怎么改
https://tieba.baidu.com/p/4152931323
作者: Five66    时间: 2023-4-7 20:07

回复 10# 小白龙

感觉应该不是这么回事
如果是单个字的地方出现乱码,那应该是最后一个,而你的情况是第三个字出现乱码 (虽说这第三个字用逗号分割开来是最后一个字)
作者: 小白龙    时间: 2023-4-7 21:26

回复 11# Five66

大佬好, ahk的这个对中文支持不好, 不搞它了




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