如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】 Topic is solved

遇到了问题?请先进行搜索(中文和英文),然后在此提问

Moderators: arcticir, tmplinshi

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】

Post by llinfeng » 05 Apr 2020, 10:42

描述:当剪切板里面有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,已按照论坛格式排版)
Last edited by llinfeng on 05 Apr 2020, 12:55, edited 1 time in total.

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】

Post by llinfeng » 05 Apr 2020, 11:14

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&amp;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&amp;t=74269">如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】 - AutoHotkey Community</a></li>
</ul>
如此看来,clip.exe通过PowerShell获得了满是问号的纯文本内容?

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】

Post by llinfeng » 05 Apr 2020, 11:28

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的文件内容:
Image
(如果图床挂了,原图见imgchr图床链接

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】

Post by llinfeng » 05 Apr 2020, 12:53

问题部分解决:换个思路,在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指令都试用。

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】

Post by llinfeng » 05 Apr 2020, 22:51

附上一个特别丑陋的解决办法:用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中文论坛继续活跃 :)

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】

Post by llinfeng » 06 Apr 2020, 08:37

搜索“PowerShell 中文乱码”,发现——调整Region/SystemLocale,增加Beta: Use Unicode UTF-8 for worldwide language support,能让中文内容在PowerShell里显示了,但最后更新到剪切板的内容还是一堆问号。改动$OutputEncoding也是没有帮助。

下面是改动过Beta: UTF-8支持之后的PowerShell:
Image

llinfeng
Posts: 65
Joined: 08 Dec 2016, 21:54
GitHub: llinfeng

Re: 如何解决从PowerShell转化过的中文乱码问题?【Markdown转换到富文本格式】  Topic is solved

Post by llinfeng » 18 Apr 2020, 18:16

简单粗暴的解决——直接重装问题电脑(上述问题只发生在一台机器上,可能是Dell Alienware的操作系统安装包有问题。换作普通的Microsoft Windows 10的 Media Creation Tool 试了下,他就自己好了 lol)

重装之后的配置:对System Locale选做Simplieid Chinese,为保险起见,也勾选了个啥Beta feature,参见这个截图Image

别的配置就再没调整,powershell的配置也没有碰。

Post Reply

Return to “请求帮助”