Unicode 谷歌云存储不处理UTF-8文件名

Unicode 谷歌云存储不处理UTF-8文件名,unicode,utf-8,google-cloud-storage,Unicode,Utf 8,Google Cloud Storage,我提供的文件来自谷歌云存储,其中一些文件名包含非ASCII、UTF-8编码字符。例如,volvía.mp3 如果我请求volvía.mp3,地面军事系统会抛出一个错误 如果我将文件名(í=%C3%AD)百分比编码为volv%C3%AD.mp3,它仍然会失败 如果我使用“组合急性重音”=%CC%81作为volvi%CC%81a.mp3对文件名进行百分比编码,则会成功 知道发生了什么事吗 编辑:它抛出的错误是“拒绝访问”错误: 匿名用户没有storage.objects.get访问对象的权限。但是,

我提供的文件来自谷歌云存储,其中一些文件名包含非ASCII、UTF-8编码字符。例如,
volvía.mp3

如果我请求
volvía.mp3
,地面军事系统会抛出一个错误

如果我将文件名(í=%C3%AD)百分比编码为
volv%C3%AD.mp3
,它仍然会失败

如果我使用“组合急性重音”=%CC%81作为
volvi%CC%81a.mp3对文件名进行百分比编码,则会成功

知道发生了什么事吗

编辑:它抛出的错误是“拒绝访问”错误:
匿名用户没有storage.objects.get访问对象的权限
。但是,这似乎是请求找不到的对象时出现的错误。

我无法重现您的问题。我上传了一个名为
volvía.mp3
的对象,并且能够以
http://storage.googleapis.com/bucketname/volvía.mp3
http://storage.googleapis.com/bucketname/volv%C3%ADa.mp3


我怀疑您实际上创建了一个具有“合并急性口音”字符的对象。您是如何上传对象的?

问题在于Mac OS的HFS+文件系统,它对文件名强制(NFD)。这意味着它将字符(如í)规范化为两个代码点(i+结合锐重音),而不是“组合”形式(如NFC)中使用的单个代码点

GCS将这两种不同的形式视为不同的文件名,尽管它们看起来完全相同


一种解决方案是在上传到GCS之前将NFD文件名转换为更常见的NFC表单(使用诸如
convmv
)的实用程序。但是,这不能在Mac OS上完成,因为文件系统本身强制NFD。

GCS返回的错误是什么?@mike schwartz一个拒绝访问的错误。Phil-你能给gs发电子邮件吗-team@google.com详细信息(特定的bucket和object名称以及发出请求的确切时间)?请提一下我的名字,这样它就会传给我。谢谢。没错,如果您没有列出存储桶的权限,拒绝访问可能意味着找不到。这些文件是使用
gsutil-mcp
上传的。这是一个合理的怀疑,但是,这就是事情变得有点模糊的地方。如果我收到一个UTF-8格式的文本,其中包含单词volvía,我提取该单词,将其存储在sqlite中,检索它,将其作为文件名写出,然后上传文件——如果原始文本使用了组合重音,这有关系吗?Bc这是我能看到这一切发生的唯一方式?我从未遇到过需要规范化发音符号编码方式的想法。此外,如果我将同一个文件上传到自己的服务器上,它就可以正常使用了。