冰箱研会长e-3M 发表于 2020-11-10 09:49

[弱智]记录一下UTF8 win10绕过mecab乱码问题的办法

本帖最后由 冰箱研会长e-3M 于 2020-11-10 09:51 编辑

Win10 2004 UTF8模式下直接使用mecab cli会出现的情况:
https://gitee.com/Arxher/ubb-img-links/raw/master/imgs/20201110093523.png
mecab无法正确接收英文字母和数字以外的字符。
注: powershell环境
::OutputEncoding = ::UTF8;
::InputEncoding = ::UTF8;

这个问题, 我在中文网络英文网络日文网络都没找到好的解决方案,
反正mecabdll的工作情况是正常的, 对于开发工作而言想必不是什么大问题.
这里主要是为了直接在cli使用mecab.

这个问题很明显是console传递文字的机制的问题,

以往和ffprobe/mediainfo战斗的经验告诉我这类问题要么无解, 要么解得献祭个一天两天的时间和自己的好心情.
所幸mecab有直接读取输出到文件的io模式, 那就可以用powershell来实现一个 "绕路" workaround.
这里简单记录一下, 以防其他像我这样没有技术的人被迫在WSL里用mecab.

GITHUB
原理没什么好说的, 就是把文字输入到临时文件里做中专而已, 是相当没有意义的代码.

function mmecab{
    param (
      $InputString
    )
    Set-Content -LiteralPath "$($PWD)/temp.txt" -Value $InputString;
    mecab "$($PWD)/temp.txt" -o "$($PWD)/temp-output.txt";
    Get-Content -LiteralPath "$($PWD)/temp-output.txt";
    Remove-Item -LiteralPath "$($PWD)/temp.txt";
    Remove-Item -LiteralPath "$($PWD)/temp-output.txt";
}
基于同样的原理, 那使用pipline代替临时文件也是可能的.
于是只需要
echo "文字" | mecab
#echo 是 Write-Output的别名 也可以实现一致的效果, 总之, 只要回避从命令行直接对mecab输入文字, 把这个过程抛给shell就可以解决 "文字化け" 现象.

经过以上设置, 可以获得正确的输出.

https://gitee.com/Arxher/ubb-img-links/raw/master/imgs/20201110094932.png

以上.




页: [1]
查看完整版本: [弱智]记录一下UTF8 win10绕过mecab乱码问题的办法