NTFS文件系统中文件名是用什么编码的?会不会Windows和三方Linux写入文件名时GBK和UTF-8编码并存?这样文件列表显示出来不是部分乱码了?

ooolinux 2020-09-14 07:56:03
NTFS文件系统中文件名是用什么编码的?会不会Windows和三方Linux写入文件名时GBK和UTF-8编码并存?这样文件列表显示出来不是部分乱码了?
...全文
776 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 11 楼 ooolinux 的回复:
[quote=引用 10 楼 早打大打打核战争 的回复:]是的,linux的locale相当于windows的code page,localectl set-locale LANG=zh_CN.UTF-8 相当于 windows的 chcp 936,实际上原始字符还是多字节字符编码

如果中国的硬盘Linux系统是zh_CN.UTF-8,美国的Linux系统是EN,都是UTF-8,那挂接硬盘中文文件名显示正常吗?[/quote]

都是unicode不会乱码(系统需要有unicode字库),但是unicode映射为非unicode locale,或者非unicode映射到unicode locale,或者非unicode locale映射到其他locale,则可能显示乱码
ooolinux 2020-09-16
  • 打赏
  • 举报
回复
引用 15 楼 早打大打打核战争的回复:
[quote=引用 14 楼 ooolinux 的回复:]
如果用户的locale先是UTF-8,后来改为GB18030之类,那硬盘文件名编码转字节不是两种都有了?以后肯定部分乱码?


是的,因为linux的文件系统没有记录使用的字符编码,如果切换locale是一个大问题
[/quote] 如果切换locale自己旧文件的文件名显示乱码,好像没道理。最好是不管什么locale,都转成unicode写入文件分配表。
  • 打赏
  • 举报
回复
引用 14 楼 ooolinux 的回复:
如果用户的locale先是UTF-8,后来改为GB18030之类,那硬盘文件名编码转字节不是两种都有了?以后肯定部分乱码?


是的,因为linux的文件系统没有记录使用的字符编码,如果切换locale是一个大问题
ooolinux 2020-09-16
  • 打赏
  • 举报
回复
引用 12 楼 早打大打打核战争的回复:
[quote=引用 11 楼 ooolinux 的回复:][quote=引用 10 楼 早打大打打核战争 的回复:]是的,linux的locale相当于windows的code page,localectl set-locale LANG=zh_CN.UTF-8 相当于 windows的 chcp 936,实际上原始字符还是多字节字符编码

如果中国的硬盘Linux系统是zh_CN.UTF-8,美国的Linux系统是EN,都是UTF-8,那挂接硬盘中文文件名显示正常吗?[/quote]

都是unicode不会乱码(系统需要有unicode字库),但是unicode映射为非unicode locale,或者非unicode映射到unicode locale,或者非unicode locale映射到其他locale,则可能显示乱码
[/quote] 如果用户的locale先是UTF-8,后来改为GB18030之类,那硬盘文件名编码转字节不是两种都有了?以后肯定部分乱码?
ooolinux 2020-09-16
  • 打赏
  • 举报
回复
引用 12 楼 早打大打打核战争的回复:
[quote=引用 11 楼 ooolinux 的回复:][quote=引用 10 楼 早打大打打核战争 的回复:]是的,linux的locale相当于windows的code page,localectl set-locale LANG=zh_CN.UTF-8 相当于 windows的 chcp 936,实际上原始字符还是多字节字符编码

如果中国的硬盘Linux系统是zh_CN.UTF-8,美国的Linux系统是EN,都是UTF-8,那挂接硬盘中文文件名显示正常吗?[/quote]

都是unicode不会乱码(系统需要有unicode字库),但是unicode映射为非unicode locale,或者非unicode映射到unicode locale,或者非unicode locale映射到其他locale,则可能显示乱码
[/quote] 明白了,中国用户Linux的locale可能设置为zh_CN.GB18030之类,硬盘拿到美国Linux系统大概率文件名显示乱码了。
ooolinux 2020-09-15
  • 打赏
  • 举报
回复
引用 7 楼 早打大打打核战争 的回复:
[quote=引用 5 楼 ooolinux 的回复:]
[quote=引用 4 楼 早打大打打核战争 的回复:]似乎linux在文件系统级不支持字符编码,文件名/目录名直接存储为字节序列,如何显示取决于当前系统的配置,这个设计有点吓人

显示时是字节系列转UTF-8或者转GBK?这样做有什么好处和问题?[/quote]

没有好处,改变区域设置后,磁盘上存储的文件名编码并不会改变,在新的区域设置下显示老的文件名就可能乱码。这应该是早期设计遗留下来的问题,不过如果区域设置一直使用unicode就不会有问题,麻烦的是如果挂接一块linux分区的硬盘,你并知道它原来系统的区域设置。
[/quote]
比如一个来自中国的Linux分区硬盘,带到美国挂接Linux系统,如果区域设置和那块硬盘原Linux系统区域设置不同,那块硬盘文件名就可能显示乱码了?
ooolinux 2020-09-15
  • 打赏
  • 举报
回复
引用 6 楼 早打大打打核战争 的回复:
[quote=引用 5 楼 ooolinux 的回复:][quote=引用 3 楼 早打大打打核战争 的回复:]linux/unix内核使用4字节字符编码(但是API层使用UTF-8),不过是UTF-32还是UCS-4不确定,这两者只有有效范围的区别,UTF-32使用32位的低21位,UCS-4使用32位的低31位
挂接文件系统,肯定要按照文件系统的存储编码访问,否则就读写错了,一般都是通过NFS协议访问非本机支持的文件系统

使用21位就是2M(2百万)的编码位置,31位是2G(20亿),为什么差那么多,世界上有那么多字符吗?
[/quote]

肯定没那么多,目前最新的unicode 12.1只定义了 137929个字符,不过unicode作为统一字符集,其雄心壮志是囊括人类有史以来创造的所有文字和符号(比如甲骨文、楔形文字、玛雅文字等等),所以编码空间必须足够大,16位不够大,24位又不便于计算机访问,所以只能用32位了
[/quote]
康熙也想不到康熙字典能搬上电脑了。
  • 打赏
  • 举报
回复
引用 5 楼 ooolinux 的回复:
[quote=引用 4 楼 早打大打打核战争 的回复:]似乎linux在文件系统级不支持字符编码,文件名/目录名直接存储为字节序列,如何显示取决于当前系统的配置,这个设计有点吓人

显示时是字节系列转UTF-8或者转GBK?这样做有什么好处和问题?[/quote]

没有好处,改变区域设置后,磁盘上存储的文件名编码并不会改变,在新的区域设置下显示老的文件名就可能乱码。这应该是早期设计遗留下来的问题,不过如果区域设置一直使用unicode就不会有问题,麻烦的是如果挂接一块linux分区的硬盘,你并知道它原来系统的区域设置。
  • 打赏
  • 举报
回复
引用 5 楼 ooolinux 的回复:
[quote=引用 3 楼 早打大打打核战争 的回复:]linux/unix内核使用4字节字符编码(但是API层使用UTF-8),不过是UTF-32还是UCS-4不确定,这两者只有有效范围的区别,UTF-32使用32位的低21位,UCS-4使用32位的低31位
挂接文件系统,肯定要按照文件系统的存储编码访问,否则就读写错了,一般都是通过NFS协议访问非本机支持的文件系统

使用21位就是2M(2百万)的编码位置,31位是2G(20亿),为什么差那么多,世界上有那么多字符吗?
[/quote]

肯定没那么多,目前最新的unicode 12.1只定义了 137929个字符,不过unicode作为统一字符集,其雄心壮志是囊括人类有史以来创造的所有文字和符号(比如甲骨文、楔形文字、玛雅文字等等),所以编码空间必须足够大,16位不够大,24位又不便于计算机访问,所以只能用32位了
ooolinux 2020-09-15
  • 打赏
  • 举报
回复
引用 10 楼 早打大打打核战争 的回复:
是的,linux的locale相当于windows的code page,localectl set-locale LANG=zh_CN.UTF-8 相当于 windows的 chcp 936,实际上原始字符还是多字节字符编码

如果中国的硬盘Linux系统是zh_CN.UTF-8,美国的Linux系统是EN,都是UTF-8,那挂接硬盘中文文件名显示正常吗?
  • 打赏
  • 举报
回复
是的,linux的locale相当于windows的code page,localectl set-locale LANG=zh_CN.UTF-8 相当于 windows的 chcp 936,实际上原始字符还是多字节字符编码
  • 打赏
  • 举报
回复
似乎linux在文件系统级不支持字符编码,文件名/目录名直接存储为字节序列,如何显示取决于当前系统的配置,这个设计有点吓人
  • 打赏
  • 举报
回复
linux/unix内核使用4字节字符编码(但是API层使用UTF-8),不过是UTF-32还是UCS-4不确定,这两者只有有效范围的区别,UTF-32使用32位的低21位,UCS-4使用32位的低31位
挂接文件系统,肯定要按照文件系统的存储编码访问,否则就读写错了,一般都是通过NFS协议访问非本机支持的文件系统
ooolinux 2020-09-14
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
NT内核和NTFS文件系统都使用UTF-16字符编码(早期的NT使用UCS-2编码),包括FAT32文件系统的长文件名也使用UTF-16编码(但是短文件名使用ANSI编码存储)
Linux和EXT4文件系统是UTF-32编码吗?在Linux下访问NTFS分区是使用UTF-16还是UTF-32?
  • 打赏
  • 举报
回复
NT内核和NTFS文件系统都使用UTF-16字符编码(早期的NT使用UCS-2编码),包括FAT32文件系统的长文件名也使用UTF-16编码(但是短文件名使用ANSI编码存储)
ooolinux 2020-09-14
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
linux/unix内核使用4字节字符编码(但是API层使用UTF-8),不过是UTF-32还是UCS-4不确定,这两者只有有效范围的区别,UTF-32使用32位的低21位,UCS-4使用32位的低31位
挂接文件系统,肯定要按照文件系统的存储编码访问,否则就读写错了,一般都是通过NFS协议访问非本机支持的文件系统

使用21位就是2M(2百万)的编码位置,31位是2G(20亿),为什么差那么多,世界上有那么多字符吗?


引用 4 楼 早打大打打核战争 的回复:
似乎linux在文件系统级不支持字符编码,文件名/目录名直接存储为字节序列,如何显示取决于当前系统的配置,这个设计有点吓人

显示时是字节系列转UTF-8或者转GBK?这样做有什么好处和问题?

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧