【问题标题】:Encoding differences between tr (ubuntu) and tr (mac)tr (ubuntu) 和 tr (mac) 之间的编码差异
【发布时间】:2011-02-26 20:03:22
【问题描述】:
echo – | tr ’ X

在我的 Mac 上:正确打印 -

在 Ubuntu 10.10 上:打印 XX。

为什么?

作为参考,第一个字符是 'EN DASH' (U+2013),第二个是 'RIGHT SINGLE QUOTATION MARK' (U+2019)

编辑:我现在改用 Perl。我使用的魔法咒语是:

perl -CSD -p -Mutf8 -e 'tr/A-ZÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛÇa-zäëïöüáéíóúàèìòùâèìòùñçßœ/ /cs'

意思是:除了我能想到的所有字母,用空格替换任何字符,然后压缩空格。

【问题讨论】:

  • LANG 在每种情况下设置的环境变量是什么?
  • 在这两种情况下都没有设置;两台机器上的 LC_ALL 都设置为 en_US.UTF-8。

标签: ubuntu encoding character-encoding


【解决方案1】:

GNU coreutils tr 存在多字节字符问题 - 它认为它们是单字节字符序列。

考虑到这一点,您在 Linux 上看到的是“预期的”:

$ echo – | od -t x1
0000000 e2 80 93 0a
0000004
$ echo ’ | od -t x1
0000000 e2 80 99 0a
0000004
$ echo – | tr ’ X | od -t x1
0000000 58 58 93 0a
0000004

编辑:

对于一组 UTF-8 兼容实用程序,您可能想查看Heirloom Toolchest。它包含一个显然支持 UTF-8 的 tr 实现,尽管我没有对其进行测试。

【讨论】:

  • 那么,我可以在 Ubuntu 上安装 Mac 自带的版本吗?
  • @Michiel:使用 Perl 是最简单的。诚实。它内置了tr
  • 呵呵,我自己也得出了同样的结论(在发现 Ruby 的 tr 坏了之后)。但是它不识别像 [:alnum:] 这样的东西。
  • 我还发现了 Heirloom,但不想乱搞 makefile 并可能破坏原始实用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2017-05-06
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
相关资源
最近更新 更多