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

时间:2012-02-21 15:52:24

标签: 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 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

但我发现了这个问题:

  

它将输入的第一个字母作为大写字母返回,例如。   输入 - lowercasetext,输出 - L,而预期输出是 -   LOWERCASETEXT。

为了检查问题,我在重复循环中添加了这行代码:

display dialog i

发现它一次显示完整的文字代替单个字符,即。代替在lowercasetext中显示l .. o .. w ..它一次显示lowercasetext。

任何人都可以建议我,为什么它在Apple脚本编辑器中正常工作时会引起我的服务行为?

4 个答案:

答案 0 :(得分:4)

这适用于很多语言:

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

答案 1 :(得分:1)

如果输入变量设置为列表,您将在AppleScript编辑器中获得相同的结果。 Automator操作的输入参数也是列表,因此您的比较没有按照您的想法进行。请注意,文本ID 已废弃 ASCII字符 ASCII数字命令 - 请参阅10.5 AppleScript发行说明。

答案 2 :(得分:1)

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

return upperCaseString as text

这可能会或可能不会为您做,但如果您在可能存在歧义时明确强制数据,您将避免很多挫折。

另一种(更快)的方法是利用Unix tr 翻译)命令来通过do shell script

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'翻译。

答案 3 :(得分:-1)

@Matt Strange:

您也可以尝试:

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

如果你跑'男人&#39; on&#39; OS X 10.10&#39;您可能会看到应使用字符类[:lower:]和[:upper:]而不是显式字符范围,例如&#39; a-z&#39;或者&#39; A-Z&#39;,因为这些可能无法产生正确的结果,如手册页所述。