macOS Automator的Ruby默认为ASCII,尽管> = 1.9

时间:2017-09-25 09:37:18

标签: ruby macos encoding utf-8 automator

我正在尝试使用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émentspourunethéoriedusystèmed'enseignement。埃德。 de Minuit。

然后运行:

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: '')有效,但清理的代价是切断多字节字符,这显然不是预期的行为。

1 个答案:

答案 0 :(得分: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

enter image description here

答案的信用来自这里:discussions.apple.com