Applescript 将小写字符转换为大写字符的脚本与服务操作的工作方式不同

Applescript 将小写字符转换为大写字符的脚本与服务操作的工作方式不同,applescript,Applescript,我正在尝试一个简单的脚本作为automator中的服务操作,它执行以下功能: 在任何应用程序中接收选定文本并替换选定文本 文本包含大写字母 所以我用了这个脚本: on run {input, parameters} set upperCaseString to "" repeat with i in input if (ASCII number i) > 96 and (ASCII number i) < 123 then set upperCaseStri

我正在尝试一个简单的脚本作为automator中的服务操作,它执行以下功能:

在任何应用程序中接收选定文本并替换选定文本 文本包含大写字母

所以我用了这个脚本:

on run {input, parameters}

set upperCaseString to ""
repeat with i in input
    if (ASCII number i) > 96 and (ASCII number i) < 123 then
        set upperCaseString to upperCaseString & (ASCII character ((ASCII number i) - 32))
    else
        set upperCaseString to upperCaseString & (ASCII character (ASCII number i))
    end if
end repeat

return upperCaseString
end run
并发现它一次显示完整文本而不是单个字符,即代替显示l。。o、 。。W在lowercasetext中,它一次显示lowercasetext


有人能告诉我为什么它在Apple Script Editor中正常工作时作为服务操作困扰着我吗?

如果将输入变量设置为列表,您将在AppleScript编辑器中得到相同的结果。自动机操作的输入参数也是一个列表,因此您的比较并不是按照您的想法进行的。请注意,文本id已经淘汰了ASCII字符ASCII数字命令-请参阅10.5 AppleScript发行说明。

当我运行脚本时,我得到了正确的结果。但您可能想做的一件事是显式地将结果强制为文本。最简单的方法是在最后:

return upperCaseString as text
这可能对您有用,也可能不有用,但如果您在可能存在歧义的情况下显式强制数据,您将避免很多挫折

另一种(更快的)方法是通过
do shell脚本利用Unixtr(translate)命令:

set upperCaseString to ¬
  (do shell script ("echo " & input & " | tr a-z A-Z;"))
这对于“英语”语言来说已经足够了,但你也可以添加变音符号翻译,就像这样

set upperCaseString to ¬
  (do shell script ("echo " & input & " | tr a-zäáà A-ZÄÁÀ;"))

tr会将任何内容转换为任何内容,因此您可以添加可能遇到的任何字符以及希望它们转换为的内容。我想到了一个“leet speak”翻译人员。

这适用于许多语言:

on toUpper(s)
tell AppleScript to return do shell script "shopt -u xpg_echo; export LANG='" & user locale of (system info) & ".UTF-8'; echo " & quoted form of s & " | tr [:lower:] [:upper:]"
end toUpper

on toLower(s)
tell AppleScript to return do shell script "shopt -u xpg_echo; export LANG='" & user locale of (system info) & ".UTF-8'; echo " & quoted form of s & " | tr [:upper:] [:lower:]"
end toLower
@马特·斯特兰奇:

您也可以尝试:

set upperCaseString to ¬
  do shell script "echo " & input & " | tr [:lower:] [:upper:]"
如果在“OS X 10.10”上运行“man tr”,您可能会看到应该使用字符类[:lower:]和[:upper:]而不是像“a-z”或“a-z”这样的显式字符范围,因为这些可能不会产生正确的结果,如手册页中所述

set upperCaseString to ¬
  do shell script "echo " & input & " | tr [:lower:] [:upper:]"