【问题标题】:macOS Automator's Ruby defaults to ASCII despite being >= 1.9macOS Automator 的 Ruby 默认为 ASCII,尽管 >= 1.9
【发布时间】:2018-03-06 05:38:09
【问题描述】:

我正在尝试使用 Ruby 脚本从 Automator 中访问 macOS 剪贴板中的文本。该脚本调用 macOS 的内部 Ruby (/usr/bin/ruby)。在遇到了很多无法识别的字符序列错误之后,我注意到 Automator 的 Ruby 默认使用 ASCII 而不是 UTF-8,而这不是几年前现代 Ruby 的默认行为。

所以,运行以下命令:

require 'clipboard'    
puts(Clipboard.paste.encoding)

总是产生“ASCII”,而从命令行运行相同的 Ruby 解释器以运行相同的脚本并粘贴相同的文本片段总是产生“UTF -8"。

当我复制重音字符(例如 ê)等多字节字符时,这会成为一个问题。例如,如果我复制以下文本:

Bourdieu, P. 和 Passeron, J.-C. (1970 年)。 La 复制:éléments pour une théorie du système d’enseignement。埃德。德米纽特。

然后运行:

require 'clipboard'    
puts(Clipboard.paste)

我在 Automator 中一无所获,而我在命令行上获得了原始文本的副本。

如果我尝试以任何方式转换文本,我会收到错误消息。假设我运行以下命令:

require 'clipboard'
puts(Clipboard.paste.gsub(/\r/,""))

作为回应,我将收到:

-e:2:in `gsub': invalid byte sequence in US-ASCII (ArgumentError)
from -e:2:in `<main>'

我怎样才能避免这种情况并确保我从剪贴板得到的内容已经转换为正确的 UTF-8?

我试过encodeforce_encoding的方法,以及# encoding: UTF-8Encoding.default_external='utf-8'Encoding.default_internal='utf-8'的多种组合,但是好像有损坏的字符阻碍了转换,所以没有成功到底。

这里有什么我忽略的,或者我没有尝试过的任何组合吗?

注意事项:

  1. 调用解释器的是 Automator,而不是我。因此,我无法修改 Automator 的调用以添加开关和修改选项。
  2. string.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '') 有效,但清理是以砍掉多字节字符为代价的,这显然不是这里的预期行为。

【问题讨论】:

  • “偶尔”是什么意思?
  • @Stefan 我正在从我不知道编码的来源复制文本。我不确定如何检测剪贴板中文本的编码。调试的一种方法可能是首先查看原始文本中是否存在编码差异。不过,这并没有改变这样一个事实,即从命令行运行 macOS 的 Ruby 时,我总是得到 UTF-8。
  • 你能举一个导致 ASCII 编码的来源的例子吗?
  • @lacostenycoder 当然!产生“2.0.0”。

标签: ruby macos encoding utf-8 automator


【解决方案1】:

我发现在 macOS Mojave 10.14.6 中,使用 # coding: UTF-8 启动 Automator 'Run Shell Script' 解决了这个问题。不确定#!/usr/bin/ruby 是否有用或必要,但我将其包括在内。您可以使用带有或不带有# coding: UTF-8 的代码进行测试:

#!/usr/bin/ruby
# coding: UTF-8

test_s = "will print ✪"
puts test_s

答案来自这里:discussions.apple.com

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 2011-06-12
    • 1970-01-01
    • 2011-03-30
    • 2011-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多