标题: 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- ; Title: Scintilla Wrapper for AHK
-
- class scintilla {
- hwnd := 0 ; Component Handle
- notify := "" ; Name of the function that will handle the window messages sent by the control
-
- ; Messages which set this variables.
- ; ---------------------------------------------------------------------------------------------------------------
- idFrom := 0 ; The handle from which the notification was sent
- scnCode := 0 ; The SCN_* notification code
- position := 0 ; SCN_STYLENEEDED, SCN_DOUBLECLICK, SCN_MODIFIED, SCN_MARGINCLICK
- ; SCN_NEEDSHOWN, SCN_DWELLSTART, SCN_DWELLEND, SCN_CALLTIPCLICK
- ; SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK, SCN_HOTSPOTRELEASECLICK
- ; SCN_INDICATORCLICK, SCN_INDICATORRELEASE
- ; SCN_USERLISTSELECTION, SCN_AUTOCSELECTION
-
- ch := 0 ; SCN_CHARADDED, SCN_KEY
- modifiers := 0 ; SCN_KEY, SCN_DOUBLECLICK, SCN_HOTSPOTCLICK, SCN_HOTSPOTDOUBLECLICK
- ; SCN_HOTSPOTRELEASECLICK, SCN_INDICATORCLICK, SCN_INDICATORRELEASE
-
- modType := 0 ; SCN_MODIFIED
- text := 0 ; SCN_MODIFIED, SCN_USERLISTSELECTION, SCN_AUTOCSELECTION, SCN_URIDROPPED
- length := 0 ; SCN_MODIFIED
- linesAdded := 0 ; SCN_MODIFIED
- macMessage := 0 ; SCN_MACRORECORD
- macwParam := 0 ; SCN_MACRORECORD
- maclParam := 0 ; SCN_MACRORECORD
- line := 0 ; SCN_MODIFIED
- foldLevelNow := 0 ; SCN_MODIFIED
- foldLevelPrev := 0 ; SCN_MODIFIED
- margin := 0 ; SCN_MARGINCLICK
- listType := 0 ; SCN_USERLISTSELECTION
- x := 0 ; SCN_DWELLSTART, SCN_DWELLEND
- y := 0 ; SCN_DWELLSTART, SCN_DWELLEND
- token := 0 ; SCN_MODIFIED with SC_MOD_CONTAINER
- annotLinesAdded := 0 ; SCN_MODIFIED with SC_MOD_CHANGEANNOTATION
- updated := false ; SCN_UPDATEUI
-
- __new(params*){
- if (params.MaxIndex())
- __SCI(this.hwnd := __Add(params*), this)
- else
- return this
- }
-
- __call(msg, ByRef wParam:=0, ByRef lParam:=0, params*){
-
- if (msg = "Add")
- __SCI(this.hwnd := __Add(wParam, lParam, params*), this)
- else
- {
- (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
-
- /*
- Special Operations
- Due to the fact that some functions require the user to manually prepare bufferst to store text
- I decided to make most of those operations internally to have cleaner code later on.
- */
-
- (msg = "GetText") ? (VarSetCapacity(lParam, wParam * (a_isunicode ? 2 : 1)+8), lParam := &lParam, buf:=true) : null
- (msg = "GetLine") ? (VarSetCapacity(lParam, this.linelength(wParam)+1 * (a_isunicode ? 2 : 1)),lParam := &lParam, buf:=true) : null
- (msg = "GetCurLine") ? (VarSetCapacity(lParam, this.linelength(wParam)+1 * (a_isunicode ? 2 : 1)), lParam := &lParam, buf:=true) : null
- (msg = "GetTextRange") ? (range:=abs(wParam.1 - wParam.2)+1, dSize := __sendEditor(this.hwnd, "GetLength")
- ,VarSetCapacity(lParam, range > dSize ? (dSize, wParam.2 := dSize) : range)
- ,VarSetCapacity(textRange, 12, 0)
- ,NumPut(wParam.1,textRange,0,"UInt")
- ,NumPut(wParam.2,textRange,4,"UInt")
- ,NumPut(&lParam,textRange,8,"UInt")
- ,blParam := &lParam, wParam := false,lParam := &textRange, buf:=true) : null
-
- __isHexColor(lParam, msg) ? lParam := (lParam & 0xFF) <<16 | (lParam & 0xFF00) | (lParam >>16) : null
- __isHexColor(wParam, msg) ? wParam := (wParam & 0xFF) <<16 | (wParam & 0xFF00) | (wParam >>16) : null
-
- res := __sendEditor(this.hwnd, msg, wParam, lParam)
-
- ; Retrieve Text from buffer
- ; I must switch lParam to another variable when using GetTextRange because lParam cant be overwriten
- ; It has the pointer to the TextRange Structure
- buf ? (lParam := StrGet((msg = "GetTextRange") ? blParam : &lParam, "CP0"), buf:=false) : null ; convert the text from ANSI
- return res
- }
- }
- }
复制代码
作者: 小白龙 时间: 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 |