Page 1 of 1
如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】
Posted: 05 Apr 2020, 10:42
by llinfeng
描述:当剪切板里面有markdown格式的纯文本的时候,键入togo,会打开PowerShell来转换成“可粘贴的富文本”。
问题是:目前仅限于英文文本的转换,中文会变成乱码。希望对中文的Markdown文本也能被转换成富文本。(注:没有"-smart"的时候,英文的单引号也会输出成?,对markdown的文本形式附上个-smart,可解决。)
简化问题是:如何把需要WSL执行的命令完完整整的用AHK激活?。详见
这个新回复(第一行有:“问题部分解决:换个思路,在WSL内部完成转换”)
Code: Select all
::togo::
Run, PowerShell "paste.exe | pandoc -f markdown-smart --from=gfm -t HTML | Set-Clipboard -AsHtml ; echo 'Conversion done.' "
Return ;
需要提前安装:1. Pandoc,可以
按照这个链接,用choco安装,2. 某个.NET模块,第一次执行Windows 10会自己安装(1809以后版本的Win 10该是自带需要的.Net模块)。
这个其实可能是个关于PowerShell的问题:Pandoc转化是默认从UTF-8到UTF-8,通过一步步比较,问题多处在最后一个“pipe”上,通过PowerShell转化成富文本的时候,PowerShell读出来的中文字符会变成乱码。
再,具体的debug步骤——拆分用到的command,会通过回复写清楚。
附1:Markdown原文
Code: Select all
* 提问:[如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】 - AutoHotkey Community](https://www.autohotkey.com/boards/viewtopic.php?f=27&t=74269)
附2:通过上面定义的togo转化出来的文本:
• ????????PowerShell????????????Markdown????????? - AutoHotkey Community (跑去Word里面粘贴出来的内容)
附3:Markdown直接转化成HTML,该有的样子:(也就是对文字加超链接,对整行加作list,已按照论坛格式排版)
Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】
Posted: 05 Apr 2020, 11:14
by llinfeng
Debug Step 1:
先看pandoc转化这个步骤,PowerShell会出问题。对比PowerShell和WSL对下面这行指令的执行结果:
Code: Select all
paste.exe | pandoc.exe -f markdown-smart --from=gfm | clip.exe
注:WSL是Windows Subsystem for Linux,可以执行在Path里面的Windows的可执行程序。
- 先把指令粘贴到PowerShell里面,再把Markdown原文复制到剪切板,最后再执行指令——剪切板内容会更新作:
Code: Select all
<ul>
<li>???<a href="https://www.autohotkey.com/boards/viewtopic.php?f=27&t=74269">?????PowerShell????????????Markdown????????? - AutoHotkey Community</a></li>
</ul>
- 先把指令粘贴到WSL里面,再把Markdown原文复制到剪切板,最后再执行指令——剪切板内容会更新作:
Code: Select all
<ul>
<li>提问:<a href="https://www.autohotkey.com/boards/viewtopic.php?f=27&t=74269">如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】 - AutoHotkey Community</a></li>
</ul>
如此看来,clip.exe通过PowerShell获得了满是问号的纯文本内容?
Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】
Posted: 05 Apr 2020, 11:28
by llinfeng
Debug Step 2: 用PowerShell转化,并cat文件内容
将Markdown原文保存到raw.md中,用
pandoc raw.md -o output.html转化(在PowerShell里面转化),生成的output.html用其他方式浏览都是没问题的,只有在PowerShell里面,会被读作乱码(output.html的file-encoding也是UTF-8)。在接下来的截图里,我分别在PowerShell和WSL里面显示output.html的文件内容:
(如果图床挂了,
原图见imgchr图床链接)
Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】
Posted: 05 Apr 2020, 12:53
by llinfeng
问题部分解决:换个思路,在WSL内部完成转换。【Pending: PowerShell的解决思路可能是“适当配置它自己的encoding?”,或是
调换chcp?(<==链接里的截图坏了)】
步骤:
- 准备WSL:安装xclip和本地的X Server。
- 在WSL里面执行下面的command(读取Clipboard,转化作HTML,再用text/html格式粘贴回Clipboard)
Code: Select all
paste.exe | pandoc -f markdown-smart --from=gfm -t HTML | xclip -t text/html -selection clipboard
然而,目前还不能实现通过AHK激活WSL并执行上面的指令。根据
这个stackoverflow上的回复,可以通过
Run, bash -c "LinuxCommand"来实现把"LinuxCommand"捅给WSL的命令行。但下面的AHK映射还是不好用:
Code: Select all
::togo::
run, bash -c "paste.exe | pandoc -f markdown-smart --from=gfm -t HTML | xclip -t text/html -selection clipboard"
return
同时,把热键映射内容换做
run, bash -c 'touch /mnt/c/Users/llinfeng/Desktop/newFile',也是能完整执行的。【还有可能是没有display变量的问题,但改做
run, bash -c "DISPLAY=:0 paste.exe | pandoc -f markdown-smart --from=gfm -t HTML | xclip -t text/html -selection clipboard"也没有帮助(剪切板里的Markdown文本没有被转化)。】
问题:咋能让AHK把在WSL里面能执行的命令,代为执行?现在看来,
bash -c并不是对所有的WSL指令都试用。
Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】
Posted: 05 Apr 2020, 22:51
by llinfeng
附上一个特别丑陋的解决办法:用sleep等WSL的emulator打开,再全部通过WSL转换
Code: Select all
convert_MD_withWSL:
; Launch WSL emulator
run, "C:\Users\llinfeng\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\WLinux Terminal", %USERPROFILE%
; Wait for it to launch
sleep 500
; Then, send the conversion script (added as an alias to WSL)
; alias togo='paste.exe | pandoc -f markdown-smart --from=gfm -t HTML | xclip -t text/html -selection clipboard'
send togo{enter}
sleep 500
; Now th clipboard content is updated, shut off the instance of WSL
send exit{enter}
; Then, go back to the previous window
send !{tab}
sleep 1000
send ^v
return
; 最后,在word里面允许通过togo热字符串来完成对剪切板内容的转换
#IfWinActive ahk_class OpusApp
::togo::
Gosub, convert_MD_withWSL
return
#IfWinActive
结语:希望得到以下两点帮助
- 关于PowerShell,该咋调encoding啥的?
- 关于WSL:如何有效的通过AHK来执行更新剪切板内容的操作(详见上一个回复)
最后,希望AHK中文论坛继续活跃
Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】
Posted: 06 Apr 2020, 08:37
by llinfeng
搜索“PowerShell 中文乱码”,发现——
调整Region/SystemLocale,增加Beta: Use Unicode UTF-8 for worldwide language support,能让中文内容在PowerShell里显示了,但最后更新到剪切板的内容还是一堆问号。改动
$OutputEncoding也是没有帮助。
下面是改动过Beta: UTF-8支持之后的PowerShell:
Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】 Topic is solved
Posted: 18 Apr 2020, 18:16
by llinfeng
简单粗暴的解决——直接重装问题电脑(上述问题只发生在一台机器上,可能是Dell Alienware的操作系统安装包有问题。换作普通的Microsoft Windows 10的 Media Creation Tool 试了下,他就自己好了 lol)
重装之后的配置:对System Locale选做Simplieid Chinese,为保险起见,也勾选了个啥Beta feature,参见这个截图
别的配置就再没调整,powershell的配置也没有碰。