我正在尝试使用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?
我尝试了encode
和force_encoding
方法,以及# encoding: UTF-8
,Encoding.default_external='utf-8'
和Encoding.default_internal='utf-8'
的各种组合,但似乎有腐败的角色阻碍了转换,所以最终没有成功。
我在这里忽略了什么,或者我没有尝试过任何组合?
注意:
string.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
有效,但清理的代价是切断多字节字符,这显然不是预期的行为。答案 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
答案的信用来自这里:discussions.apple.com