MacOS 下载的文件名字乱码问题

发布时间 2023-04-19 23:54:04作者: 很聪明的Joy

MacOS 下载的文件名字乱码问题

千羽之城88IP属地: 新疆
12019.01.14 19:20:02字数 1,008阅读 33,710

第一种乱码类型

在网络上查了一圈,找到三个相关答案:

  1. 下载的文件名总是「乱码」?这里有各平台的解决方法 :
    https://sspai.com/post/44360
    Automator 流程:
    https://cl.ly/2v1E3n3f1q2M
  2. Mac OS X 下文件名乱码出现的原因和解决方法:
    https://zzi.io/?p=275
  3. 预组字符:
    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

制作“服务”步骤

  1. 打开automator


     
    1. 打开automator
  2. 创建 quick action 类型


     
    2. 创建 quick action 类型
  3. 将run shell script 拖到右边下面


     
    3. 将run shell script 拖到右边下面
  4. 将粘贴代码到 do/done 之间


     
    4. 将粘贴代码到 do/done 之间

保存上面的得到的文件,系统会自动加载该文件,变成“右键”的服务。

 
8fb4dbdd32fc8fc8c5b6e13a7187d25a.gif

此处作废【更新 2019-10-31】

我们使用参考一的文件,下载后,双击安装,点击文件,右击就可以改名了。

 
image.png

 

解释

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).

  1. Åström (U+00C5 U+0073 U+0074 U+0072 U+00F6 U+006D)
  2. Å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

效果如下:

 
urldecode.gif

制作步骤同上

  1. 在 automator 里面新建服务,
  2. 找到run shell script——粘贴代码
  3. 找到set value of variable,拖到run shell script下面,设置一个变量如: output
  4. 找到Display Notification,拖到set value of variable下面,输入变量名:output
  5. 保存。在右键就可以看到服务了。
 
image.png

第三种乱码 [更新 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)'

参考

  1. 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.