【问题标题】:How do you convert unicode string to escapes in bash? [closed]如何在 bash 中将 unicode 字符串转换为转义? [关闭]
【发布时间】:2018-07-12 13:44:53
【问题描述】:

我需要一个工具来将 unicode 字符串翻译成转义字符,如 \u0230。

例如,

echo ãçé | convert-unicode-tool
\u00e3\u00e7\u00e9

【问题讨论】:

  • StackOverflow 不是“请给我写一个脚本”服务。到目前为止,您尝试了什么?
  • 转换取决于输入编码(由命令locale 列出)。这里给出的答案忽略了这个问题。 this duplicate 有一个 encoding-independent solution (由于问题已关闭,因此无法在此处回答)。

标签: bash shell unicode character-encoding


【解决方案1】:

所有 bash 方法 -

echo ãçé |
   while read -n 1 u
   do [[ -n "$u" ]] && printf '\\u%04x' "'$u"
   done

前面的撇号是 printf 格式/解释指南。

来自the GNU man page online

如果数字参数的前导字符是 '"' 或 ''',那么它的值是紧随其后的字符的数值。如果设置了 POSIXLY_CORRECT 环境变量,则任何剩余的字符都将被忽略;否则,会出现警告被打印。例如,'printf "%d" "'a"' 在使用 ASCII 字符集的主机上输出 '97',因为 'a' 在 ASCII 中具有数值 97。

这让我们可以将字符传递给 printf 以进行数字解释,例如 %d 或 %03o,或者这里是 %04x。

[[ -n "$u" ]] 是因为有一个空尾字节,否则将附加为 \u0000

输出:

$:     echo ãçé |
>        while read -n 1 u
>        do [[ -n "$u" ]] && printf '\\u%04x' "'$u"
>        done
\u00e3\u00e7\u00e9

没有空字节检查 -

$: echo ãçé | while read -n 1 u; do printf '\\u%04x' "'$u";done
\u00e3\u00e7\u00e9\u0000

【讨论】:

  • 注意:-n 尊重(因此忽略)有效的分隔符,如空格、制表符和换行符。如果您也希望它接收这些内容,请使用 -N
  • 谢谢。为了避免空格问题,我使用这种方法: for (( i = 0; i
  • 而不是读取 -n?
【解决方案2】:
› echo -n ãçé | perl -C -e'print for map { sprintf "\\u%04x", ord } split //, readline'
\u00e3\u00e7\u00e9

【讨论】:

  • 为什么是for?没有工作正常。 $: echo -n ãçé | perl -C -e'print map { sprintf "\\u%04x", ord } split //, readline'\u00e3\u00e7\u00e9
  • 因为我把它和print "listexpr in babycart"(实际上和print "@arrayvar"一样)混淆了,后者在输出中穿插了空格; for 迭代可以防止这种情况发生。
  • 这里没有伤害任何东西。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 2010-11-02
  • 2010-09-16
  • 2010-12-09
相关资源
最近更新 更多