第一种乱码类型
在网络上查了一圈,找到三个相关答案:
- 下载的文件名总是「乱码」?这里有各平台的解决方法 :
https://sspai.com/post/44360
Automator 流程:
https://cl.ly/2v1E3n3f1q2M - Mac OS X 下文件名乱码出现的原因和解决方法:
https://zzi.io/?p=275 - 预组字符:
https://zh.wikipedia.org/wiki/预组字符
乱码一:
FCPXæ??件ï¼?ç§?ç®?æ´?è¿·ä½ LOGOæ ?å¿?å±?示ç??头Minimal Logo Stings.dmg
修复后:
FCPX插件:20个现代字幕条动画Modern Lower Thirds .dmg
参考一中的代码是关键:
for f in "$@"
do
fileName=$(basename ${f})
filePath=$(dirname ${f})
# 两种乱码类型 GBK、UTF-8
{ fileNewName=$(echo $fileName | iconv -f UTF-8-Mac -t latin1 | iconv -f gbk)
} || { fileNewName=$(echo $fileName | iconv -f UTF-8-Mac -t latin1)
} || { fileNewName=$(echo $fileName) | iconv -f UTF-8-Mac -t GBK
} # 更新 2021-03-12
# 文件名正常或乱码类型不属上述两种时,新文件名为空,则跳过
if [ -n "$fileNewName" ]; then
# 避免文件重复:如果已存在修复后的文件名,则在新文件名后加上随机字符串。
if [ -e ${filePath}/$fileNewName ]; then
mv "$f" "${filePath}/${fileNewName}-${RANDOM}"
else
mv "$f" "${filePath}/${fileNewName}"
fi
fi
done
制作“服务”步骤
-
打开automator
-
创建 quick action 类型
-
将run shell script 拖到右边下面
-
将粘贴代码到 do/done 之间
保存上面的得到的文件,系统会自动加载该文件,变成“右键”的服务。
此处作废【更新 2019-10-31】
我们使用参考一的文件,下载后,双击安装,点击文件,右击就可以改名了。
解释
utf-8-mac(Decomposed) | ⇒ | latin1(Precomposed) |
---|
我们试图解读一下,其中 iconv -f utf-8-mac -t latin1
是将字符先进行 precomposed
处理,接着 iconv -f gbk
,那么为什么要这么处理呢?因为MacOS默认使用 "decomposed" 的字符编码。什么是 decomposed
和 precomposed
呢?
瑞典语 的姓氏 Åström 可以有两种Unicode表示方式,第一种采用预组字符Å (U+00C5)与ö (U+00F6), 第二种采用可分解基本字符A (U+0041)与上圆圈 (附加符号) (U+030A) 以及o(U+006F)与分音符 (U+0308).
- Åström (U+00C5 U+0073 U+0074 U+0072 U+00F6 U+006D)
- Åström (U+0041 U+030A U+0073 U+0074 U+0072 U+006F U+0308 U+006D)
说人话就是:window系统是用 拉丁字母+acute
的 precomposed 方式,而 mac 系统使用 拉丁字母+acute1+acute2
的方式。
第二种乱码类型
乱码二:
%E7%BB%8F%E6%B5%8E%E5%AD%A6%E7%9A%84%E6%80%9D%E7%BB%B4%E6%96%B9%E5%BC%8F++%E4%BF%AE%E8%AE%A2%E7%AC%AC12%E7%89%88.pdf
修复后:
经济学的思维方式++修订第12版.pdf
如果文件名出现了 %
符号是使用了encodeURI
将文件名编码(参考 这里
),而下载的时候被编码过的文件名没有被改过来,就直接下载了,所以显示的乱码。修复代码如下:
for file in "$@"
do
# 等号两边不能有空格,不然没法执行
fileName=$(basename -- "$file")
filePath=$(dirname -- "$file")
newName=$(echo -e "$fileName"| perl -pe 'y/+/ /;s/\%(\w\w)/chr hex $1/ge')
# 重命名文件
mv "$file" "${filePath}/${newName}"
echo %文件名乱码修复成功!
done
效果如下:
制作步骤同上
- 在
automator
里面新建服务, - 找到
run shell script
——粘贴代码
- 找到
set value of variable
,拖到run shell script
下面,设置一个变量如:output
- 找到
Display Notification
,拖到set value of variable
下面,输入变量名:output
。 - 保存。在右键就可以看到服务了。
第三种乱码 [更新 2021-03-12]
闂茶瘽ID锛圛nDesign CS5锛夊彜绫嶆帓鐗堝強鐩稿叧闄勪欢
此乱码来自MAC把GBK编码以UTF-8-MAC解析得到的乱码,可以根据依据一下代码解析:
echo "闂茶瘽ID锛圛nDesign CS5锛夊彜绫嶆帓鐗堝強鐩稿叧闄勪欢" | iconv -t gbk
echo '闂茶瘽ID锛圛nDesign CS5锛夊彜绫嶆帓鐗堝強鐩稿叧闄勪欢' | \
python3 -c 'import sys; str=sys.stdin.readlines();str=str[0].encode("gb18030").decode("UTF_8");print(str)'
参考
-
http://mirror.informatimago.com/next/developer.apple.com/qa/qa2001/qa1235.html
Q: How do I convert a Unicode string to its precomposed form?
A: It is possible to convert a string to precomposed Unicode using APIs introduced in Mac OS X 10.2. The rest of this Q&A explains the difference between precomposed and decomposed Unicode, why you might want to convert to precomposed Unicode, and how to do so.
Precomposed versus Decomposed
Certain Unicode characters can be encoded in more than one way. For example, an Á (A acute) can be encoded either precomposed, as U+00C1 (LATIN CAPITAL LETTER A WITH ACUTE), or decomposed, as U+0041 U+0301 (LATIN CAPITAL LETTER A followed by a COMBINING ACUTE ACCENT). Precomposed characters are more common in the Windows world, whereas decomposed characters are more common on the Mac.