AppleScript中如何正确编写及执行iconv相关shell命令?
解决AppleScript中iconv相关的两个问题
1. 正确编写do shell script "echo | iconv"
这个命令本身语法是合法的,但没有实际转换作用——因为echo默认输出空行(或仅换行),且iconv未指定源编码(-f)和目标编码(-t),它会按系统默认编码处理输入,最终输出和输入一致的内容。
如果想用来做编码转换测试,需要补充iconv的必要参数。比如将UTF-8文本转换为UTF-16BE:
do shell script "echo 'Hello World' | iconv -f utf-8 -t utf-16be"
要是只是验证do shell script调用iconv的基本逻辑,原命令可以直接运行,但要清楚它不会产生有意义的转换结果。
2. 修复echo -ne '\\x00\\x20' | iconv -f utf-16be的错误
你遇到的报错核心原因是:AppleScript的do shell script默认使用POSIX标准的sh shell,而非bash,sh里的echo不支持-n(不输出换行)和-e(解析转义序列)选项。这导致echo -ne '\\x00\\x20'并没有输出你期望的0x00和0x20字节,反而把-ne当成普通字符串输出,再加上未被解析的\x00\x20字符,最终输入给iconv的内容不是有效的UTF-16BE编码(UTF-16BE要求每个字符占2字节,错误输入的字节序列不完整)。
解决办法是用printf代替echo——printf是POSIX标准命令,在所有兼容shell中都支持转义序列,行为更可靠。正确的命令写法如下:
# 让iconv解析UTF-16BE字节(输出默认编码结果) do shell script "printf '\\x00\\x20' | iconv -f utf-16be" # 转换为指定编码(比如UTF-8),加上-t参数 do shell script "printf '\\x00\\x20' | iconv -f utf-16be -t utf-8"
printf '\\x00\\x20'会准确输出0x00和0x20两个字节,这正好是UTF-16BE编码的空格字符,iconv可以正确解析,不会再报“不完整字符”的错误。
内容的提问来源于stack exchange,提问作者NFDream
相关产品推荐
相关产品推荐

