【发布时间】: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?
我试过encode和force_encoding的方法,以及# encoding: UTF-8、Encoding.default_external='utf-8'和Encoding.default_internal='utf-8'的多种组合,但是好像有损坏的字符阻碍了转换,所以没有成功到底。
这里有什么我忽略的,或者我没有尝试过的任何组合吗?
注意事项:
- 调用解释器的是 Automator,而不是我。因此,我无法修改 Automator 的调用以添加开关和修改选项。
-
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