php - 文件名包含变音符号(ä、ö、ü),因此文件名似乎不同
问题描述
当我从数据库加载“Österreich”时,它与我的文件名“Österreich”不匹配。那就是问题所在。
我有一个名为“Österreich.php”的文件,我想从相应的目录中读取它。当我strlen()
在“Österreich”(不是“.php”)上使用时,它返回 12,但是,它应该是 10。这会导致问题,因为我想用它从数据库中加载数据,无论出于何种原因,它似乎是一个“不同”的词。
有任何想法吗?
解决方案
提示是Ö
理想情况下应该是一个两字节的 UTF8 序列,字符串的字节长度是 11,而不是 12。
我能想到的唯一方法是Österreich
占用 12 个字节,如果它是一个非理想但仍然有效的常规形式O
加上一个单独的变音符号组合标记。例如:O\u{0308}sterreich
function utf8_denormalize($string) {
return implode('',
array_map(
function($c){
if(strlen($c) > 1){
return Normalizer::getRawDecomposition($c);
}
return $c;
},
preg_split('//u', $string)
)
);
}
$str1 = "Österreich";
$str2 = "O\u{0308}sterreich";
$str3 = Normalizer::normalize($str2);
$str4 = utf8_denormalize($str1);
var_dump(
$str1,
$str2,
$str3,
$str4,
$str1 === $str3,
$str2 === $str4
);
输出:
string(11) "Österreich"
string(12) "Österreich"
string(11) "Österreich"
string(12) "Österreich"
bool(true)
bool(true)
我会说应该检查和/或规范化此问题双方的数据,但您也应该小心,因为您的数据库和/或由规范化和非规范化形式组成的文件系统中可能有“重复”文件名各种字符串。
https://www.php.net/manual/en/normalizer.normalize.php
编辑
Mac HFS 是愚蠢的,并且需要文件名的非规范化形式。我拼凑了一个反规范化器 [YMMV] 但老实说,除非您的生产环境是 Mac 机器,否则您应该针对与您的生产环境尽可能匹配的 VM 测试您的代码。文件系统的特殊性只是会影响工作的众多边缘案例之一。
推荐阅读
- sql-server - SQL-Server - SQL Server Management Studio 的对象资源管理器中的链接服务器在哪里?
- python - 匹配 MongoDB 中的两列
- performance - 使 MVC 控制器操作异步如何提高性能?
- r - 将两个数值变量与联合并保留新列作为 r 中的数值变量
- c++ - C++自动推断模板成员指针的类型
- html - 为什么 HTML 位置:固定;像这样工作
- javascript - 同时发送许多 POST 请求 Nodejs
- c# - 如何在 WPF 中在运行时更新可见性
- python - 如何更改烧瓶路由函数以外的变量的值?
- javascript - 为什么 Telegram bot 在一段时间后停止工作,Netlify 问题?