【发布时间】:2021-03-13 11:38:25
【问题描述】:
我正在 WSL Debian 上运行一个脚本,该脚本从本地安装的共享驱动器中获取 Windows 文件。问题是文件名编码错误,即使#encoding 返回#<Encoding:UTF-8>。示例:
"J\u00E9r\u00E9my".encoding # #<Encoding:UTF-8>
\u00E9是é的Unicode字符,所以我假设编码是Unicode
我从相关问题(Convert a unicode string to characters in Ruby?、How to convert a string to UTF8 in Ruby)中尝试了几种编码组合,但都不符合我的需求。
我也尝试了不同的“魔法 cmets”encoding: <ENCODING>,但没有令人满意的结果。
您识别和修复编码问题的方法是什么?
Edit1:Stefan 要求提供代码点:
"J\u00E9r\u00E9my".each_codepoint.to_a
# [74, 233, 114, 233, 109, 121]
和Encoding.default_external
Encoding.default_external
# #<Encoding:US_ASCII>
这让我很惊讶,因为我的文件顶部有一条神奇的评论 # encoding: utf-8
Edit2:将default_internal 和default_external 编码明确设置为Encoding::UTF_8 解决了问题
# encoding: utf-8
Encoding.default_internal = Encoding::UTF_8
Encoding.default_external = Encoding::UTF_8
虽然我想更进一步并真正理解为什么需要这样做
【问题讨论】:
-
你能显示字符串的
codepoints吗?Encoding.default_external返回什么? -
编码注释in the file设置编码in the file。它不会更改 Windows 文件系统的编码。它怎么会这样做?
-
# encoding: utf-8只是关于文件的编码,它仅(甚至不总是)由您的编辑器使用。编译器可能会使用它,但仅用于第一阶段:读取文件)