微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用* nix中的控制台工具将\ uXXXX unicode转换为UTF-8

我使用curl获得一些URL响应,这是JSON响应,它包含unicode转义的国家字符,如u0144 (ń)u00f3 (ó)

我如何将它们转换为UTF-8或任何其他编码保存到文件

GetwindowText无法处理商标符号

IntelliJ认系统编码

与Media Foundation硬件H264编码ID3D11Texture2D

调用system()的行为与命令提示符(cmd)的行为不同

R:即使指定编码,也不能读取unicode文本文件

我不知道你使用的是哪种发行版,但是应该包含uni2ascii

$ sudo apt-get install uni2ascii

它只依赖于libc6,所以它是一个轻量级的解决方案(在Ubuntu上uni2ascii i386 4.18-2是55,0 kB)!

然后使用它:

$ echo 'Character 1: u0144,Character 2: u00f3' | ascii2uni -a U -q Character 1: ń,Character 2: ó

可能会有点丑,但echo -e应该这样做:

echo -en "$(curl $URL)"

-e解释转义, -n抑制通常会添加的换行符。

注意: u转义工作在bash内建的echo ,而不是/usr/bin/echo 。

正如在注释中指出的那样,这是bash 4.2+,4.2.x有一个处理0x00ff / 17值(0x80-0xff)的bug。

我发现JDK中的native2ascii是最好的方法

native2ascii -encoding UTF-8 -reverse src.txt dest.txt

详细描述在这里: http : //docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/native2ascii.html

更新:自JDK9以来不再可用: https ://bugs.openjdk.java.net/browse/JDK-8074431

假设u后面总是紧跟着4个十六进制数字:

#!/usr/bin/perl use strict; use warnings; binmode(STDOUT,':utf8'); while (<>) { s/\u([0-9a-fA-F]{4})/chr(hex($1))/eg; print; }

binmode将标准输出转换为UTF-8模式。 s...命令将每个出现的u后跟4个十六进制数字替换为相应的字符。 e后缀会导致替换被评估为表达式而不是视为字符串; g说,要取代所有的事件,而不是只是第一次。

您可以将上述内容保存到$PATH某个文件中(不要忘记chmod +x )。 它将标准输入(或命令行中命名的一个或多个文件)过滤到标准输出

使用/usr/bin/printf "u0160iniu010di Hou0161i - Au017e sa skonu010du00ed zima"来获得适当的Unicode到/usr/bin/printf "u0160iniu010di Hou0161i - Au017e sa skonu010du00ed zima"转换。

不要依赖正则表达式:JSON有u转义和非BMP代码点的一些奇怪的角落案例。 (具体来说,JSON将使用两个 u转义符对一个代码点进行编码)如果您假定1个转义序列转换为1个代码点,则注定会出现在这样的文本上。

从您选择的语言中使用完整的JSON解析器相当强大:

$ echo '["foo bar u0144n"]' | python -c 'import json,sys; sys.stdout.write(json.load(sys.stdin)[0].encode("utf-8"))'

这实际上只是将数据提供给这个简短的Python脚本:

import json import sys data = json.load(sys.stdin) data = data[0] # change this to find your string in the JSON sys.stdout.write(data.encode('utf-8'))

从中你可以保存为foo.py和调用curl ... | foo.py curl ... | foo.py

在这个问题上会打破大多数其他尝试的例子是"ud83dudca3" :

% printf '"\ud83d\udca3"' | python2 -c 'import json,sys; sys.stdout.write(json.load(sys.stdin)[0].encode("utf-8"))'; echo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐