【问题标题】:Using utf8 characters in wildcard path in bash commands在 bash 命令的通配符路径中使用 utf8 字符
【发布时间】:2015-11-07 13:11:32
【问题描述】:

我在 osx 10.11 上使用带有控制台命令的通配符路径有问题(但我想它在 linux 上会类似)

我有捷克语中按事件和日期命名的文件夹结构。

我需要按月列出子文件夹中的文件。我想使用这样的通配符:

ls export/*prosince\ 2013/*

虽然这可行,但当我想在通配符中使用 utf8 时,我得到“没有这样的文件或目录”

ls export/*září\ 2013/*

语言环境看起来正确

winsik:Fotky vita$ locale

LANG="cs_CZ.UTF-8"
LC_COLLATE="cs_CZ.UTF-8"
LC_CTYPE="cs_CZ.UTF-8"
LC_MESSAGES="cs_CZ.UTF-8"
LC_MONETARY="cs_CZ.UTF-8"
LC_NUMERIC="cs_CZ.UTF-8"
LC_TIME="cs_CZ.UTF-8"
LC_ALL=

如何在 shell 命令中使用 utf8 字符?

编辑:我发现了一个奇怪的情况,如果我让终端用 TAB 键完成一些 UTF8 路径,然后使用这个字符,那么它可以工作,但是当我用键盘输入它们时它不会 - 相同的行为在 terminal.app 和 iterm2.app 中

winsik:Fotky vita$ bind -v | grep meta
set convert-meta off
set input-meta on
set meta-flag on
set output-meta on

【问题讨论】:

  • Bash Readline 配置中的元变量是什么? IIRC bind -V | grep meta
  • 附加到问题中,我目前也发现了奇怪的行为 - 请参阅编辑
  • 我可以推测 Bash 使用与您的系统不同的 Unicode 规范化,但这将是一个非常严重的错误。或者这些文件是否可能位于具有非默认或破坏规范化的外部文件系统上?换句话说,文件名中的编码字节是什么,以及何时在提示符下键入它们?您的终端也可能是罪魁祸首,但如果您使用控制台上的默认终端,那似乎更不可能。
  • 您的终端模拟器使用什么字符编码?您可能正在使用不同的编码输入文本;终端仍然显示正确的字形,但 bash 正在获取非 UTF-8 字节流。

标签: bash utf-8 wildcard


【解决方案1】:

大多数 Unicode 系统使用一种称为“完全组合”的 Unicode 规范化形式,而 Apple 通常使用“完全分解”。背景见Unicode equivalence in Wikipedia;但简而言之,有两种方法可以表示像 ř 这样的重音字符 - 预先组合的单个代码点 (U+0159),或简单的 r (U+0072) 后跟组合重音 (U+030C),即字体渲染器在基本字母上方加入。

如果 Unicode 规范化是问题,我预计您将无法成功重复以下步骤。这是在 OSX Yosemite 的终端中。

yosemite:~ tripleee$ touch 'Jiří'

yosemite:~ tripleee$ ls
Jiří

yosemite:~ tripleee$ printf '%s\n' *
Jiří

yosemite:~ tripleee$ printf '%s' * | xxd
0000000: 4a69 72cc 8c69 cc81                      Jir..i..

yosemite:~ tripleee$ rm 'Jiří'

(从链接的页面可以看出,加入caron U+030C的UTF-8编码是0xCC 0x8C这两个字节。)

yosemite:~ tripleee$ perl -e 'open(F, "Ji\N{U+0159}\N{U+00ED}")'

yosemite:~ tripleee$ ls
Jiří

yosemite:~ tripleee$ printf '%s' * | xxd
0000000: 4a69 72cc 8c69 cc81                      Jir..i..

如您所见,即使我特别要求预组合字符 U+0159 和 U+00ED,操作系统在创建文件之前将它们规范化为分解。

这确实应该是一个评论,但我将其发布为一个推测性的答案,希望它至少可以帮助您反驳这个假设。如果您可以毫无问题地重复此操作,我想我们可以排除 Unicode 规范化作为问题的可能根源。

【讨论】:

  • 我能够在相同的步骤中做到这一点(在这里的列表中,变音符号不在字母上,我可以像往常一样看到它们:'Jiří')但所有代码都是相同的。所以我想输入的终端和规范化是可以的。我会检查目录本身的字符——它们是由照片应用程序生成的。所以可能我正在尝试解决其他一些问题:)
  • 您的评论说您看到变音符号是分开的,但复制/粘贴“我可以像往常一样看到它们:'Jiří'”为我显示,r 在 r 上,尖锐在 i 上.你是说它看起来不一样吗?
  • 在你上面的回答中,我没有看到 r 和 i 上的 caron 和急性,而是作为单独的字符(我想它的 stackoverflow 格式但是)。在终端中,我通常会在字母上方看到它们。
  • 听起来更基本的东西被打破了。黑暗中的另一个镜头:您是否使用了不支持 Unicode 的不寻常字体?
  • 我也有同样的问题。我认为 Tripleee 是对的,它是关于预组合和分解的 unicode 之间的区别。但它是 bash 中的一个错误,它只会被通配符和制表符补全之类的东西触发。 apple.stackexchange.com/questions/10476/…
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多