删除文件名中的粗体字符

getting rid of bold characters in a filename

提问人:VaN 提问时间:6/1/2023 更新时间:6/1/2023 访问量:57

问:

MySQL最近向我报告了以下错误:[HY000][1366] Incorrect string value: '\xF0\x9D\x98\xBD\xF0\x9D...' for column 'name'

经过调查,我发现带有奇怪字符的值来自文件名,该文件显然包含粗体字符:4 𝘽𝘼𝙉𝘿𝙀 𝘼𝙉𝙉𝙊𝙉𝘾𝙀 - TV.mp4

与其更改数据库的编码以接受此类字符,我宁愿在 PHP 中插入值之前对其进行清理。但是我不知道我应该运行哪个操作以以下清理值结束:4 BANDE ANNONCE - TV.mp4

任何帮助将不胜感激。

PHP 编码 清理

评论

0赞 dognose 6/1/2023
这回答了你的问题吗?有效文件名的正则表达式
0赞 VaN 6/1/2023
没有。最初的问题是关于 C# 和提供的 Anwers 似乎不匹配
0赞 Chris Haas 6/1/2023
有几种解决方案可以通过查找数组进行一些替换,这可能会有所帮助。您可以使用翻译来“修复”这些问题,然后对无效字符执行正常替换
0赞 CBroe 6/1/2023
这些不是以某种方式“加粗”的普通拉丁字母字符,但这些是它们自己的字符 - 例如,数学无衬线粗体斜体大写字母 B (havirho.eu/Programming/U-1D400-tm-U-1D7FF.htm) 因此,您必须实现一个逻辑来将它们“翻译”为相应的常规字母。𝘽

答:

2赞 Paul Lake 6/1/2023 #1

您可以使用 PHP 函数将字符串从一种字符编码转换为另一种字符编码。在这种情况下,您可以尝试将字符串从 至 转换为 ,这将尝试将任何非 ASCII 字符音译为最接近的 ASCII 等效字符。iconvUTF-8ASCII//TRANSLIT

下面是一个示例:

function sanitize_string($input_string) {
    $sanitized_string = iconv("UTF-8", "ASCII//TRANSLIT", $input_string);
    return $sanitized_string;
}

$filename = "4 𝘽𝘼𝙉𝘿𝙀 𝘼𝙉𝙉𝙊𝙉𝘾𝙀 - TV.mp4";
$sanitized_filename = sanitize_string($filename);
echo $sanitized_filename;

这应该输出 ,这是您要查找的清理值。4 BANDE ANNONCE - TV.mp4

评论

0赞 VaN 6/1/2023
是的,这也是我发现的最准确的修复程序。在编写单元测试时,我偶然发现了一个问题:将去掉大写字母并返回。有没有办法让“干净”的字符保持不变?iconv("UTF-8", "ASCII//TRANSLIT", "Clean File Name.mp4")clean file name.mp4
0赞 Chris Haas 6/1/2023
@VaN,当我尝试它时,情况并非如此,但这可能取决于您系统的底层 iconv 实现: 3v4l.org/hs41h