Den*_*s G 5 powershell json facebook utf-8 facebook-messenger
我们都知道UTF-8很难.我从Facebook导出了我的消息,生成的JSON文件将所有非ascii字符转义为unicode代码点.
我正在寻找一种简单的方法来将这些unicode代码点转换为常规的旧UTF-8.我也很想使用PowerShell.
我试过了
$str = "\u00f0\u009f\u0091\u008d"
[Regex]::Replace($str, "\\[Uu]([0-9A-Fa-f]{4})", `
{[char]::ToString([Convert]::ToInt32($args[0].Groups[1].Value, 16))} )
Run Code Online (Sandbox Code Playgroud)
但这只会给我ð,不是.
我也试过使用Notepad ++,我发现这个帖子如何\u0432\u0441\u0435:如何在Notepad ++中将转义的Unicode(例如)转换为UTF-8字符(все).接受的答案也与上面的例子完全相同:ð.
我在这里找到了解码解决方案:完全解码文本的UTF8.js库,你可以在这里试试(\u00f0\u009f\u0091\u008d作为输入).
PowerShell中有一种方法可以解码\u00f0\u009f\u0091\u008d接收吗?我喜欢在导出的Facebook消息中使用真正的UTF-8,所以我可以真正阅读它们.
帮助我理解\u00f0\u009f\u0091\u008d实际代表什么的奖励积分(除了它是一些UTF-8十六进制表示).为什么它U+1F44D和\uD83D\uDC4DC++一样?
字符的Unicode代码点是U+1F44D。
使用可变长度UTF-8编码,需要以下4个字节(表示为十六进制数字)来表示此代码点:F0 9F 91 8D。
尽管这些字节在您的字符串中是可以识别的,
$str = "\u00f0\u009f\u0091\u008d"
Run Code Online (Sandbox Code Playgroud)
不应将它们表示为\u转义码,因为它们不是Unicode代码单位/代码点,而是bytes。
使用4个十六进制数字的转义序列(UTF-16),正确的表示将需要2个16位Unicode代码单元,即所谓的代理对,它们一起代表单个非BMP代码点 U+1F44D:
$str = "\uD83D\uDC4D"
Run Code Online (Sandbox Code Playgroud)
如果您的JSON输入使用了正确的Unicode转义,PowerShell将正确处理该字符串;例如:
'{ "str": "\uD83D\uDC4D" }' | ConvertFrom-Json > out.txt
Run Code Online (Sandbox Code Playgroud)
如果检查file out.txt,将会看到类似以下内容的内容:
str
---
Run Code Online (Sandbox Code Playgroud)
(输出已发送到文件,因为控制台窗口无法正确呈现字符。至少在没有其他配置的情况下不会如此;请注意,但是,如果在Linux或macOS上使用PowerShell Core,则终端输出将起作用。)
因此,最好的解决方案是从源头纠正问题并使用正确的Unicode转义符(甚至使用字符本身,只要源支持任何标准Unicode编码即可)。
如果您真的必须解析损坏的表示形式,请尝试以下变通方法(PSv4 +),以您自己的[regex]::Replace()技术为基础:
$str = "A \u00f0\u009f\u0091\u008d for Mot\u00c3\u00b6rhead."
[regex]::replace($str, '(?:\\u[0-9a-f]{4})+', { param($m)
$utf8Bytes = (-split ($m.Value -replace '\\u([0-9a-f]{4})', '0x$1 ')).ForEach([byte])
[text.encoding]::utf8.GetString($utf8Bytes)
})
Run Code Online (Sandbox Code Playgroud)
这应该产生 A for Motörhead.
上面的代码将\u...转义序列转换为它们表示的字节值,并将生成的字节数组解释为UTF-8文本。
要将解码后的字符串保存到UTF-8文件,请使用... | Set-Content -Encoding utf8 out.txt
或者,在PSv5 +,丹尼斯本人建议,你可以Out-File因此它是虚拟的别名,>,默认通过PowerShell的全局参数,默认为UTF-8哈希表:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
Run Code Online (Sandbox Code Playgroud)
但是请注意,在两种情况下,在Windows PowerShell(与PowerShell Core相对)上,您都将获得带有BOM的UTF-8文件-避免这种情况需要直接使用.NET框架:请参见使用PowerShell在Windows 中编写文件没有BOM的UTF-8
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |