【问题标题】:detect wrong written umlauts检测错误的书面变音符号
【发布时间】:2017-06-21 12:36:27
【问题描述】:

我们需要将包含错误变音符号的 CSV 文件导入 MySQL。

例如:使用非德语键盘的人输入U(ASCII 85)而不是Ü(ASCII 154)并使用ASCII 249添加两个高点,这对他来说是一样的。

MySQL 将此作为U? 写入数据库。这就是为什么我们希望 PHP 检测非 ASCII 字符组合,例如可打印的 ASCII 字符和扩展的 ASCII 字符的组合,这在现实世界中不存在,至少在主要语言中不存在。

我们尝试过的preg_replace 函数,没有检测到这个或者也检测到有效的变音符号。

preg_replace 有成功的机会还是有其他方法?

【问题讨论】:

  • 您可以将这些组合与preg_match_all('~\p{L}\p{M}+~u', $s, $m) 匹配。但我怀疑您是否可以轻松地将它们替换为相应的宽字符 Unicode 字母。也许,您需要一个多字节到宽字符字母的映射。
  • 当您阅读任何文本文件时,包括 CSV,您必须使用作者使用的字符编码。那么,CSV文件的编码是什么? (ASCII 没有编号为 154 或 249 的代码单元或代码点。)它是 IBM850 吗?正确读取文本后,您可以替换每个元音变音字符的不正确表示(“U¨”与“Ü”)。

标签: php preg-replace ascii


【解决方案1】:

由于您想使用 PHP 代码来检测基本字母后跟 1 个或多个变音符号的任何组合,您可以使用

if (preg_match('~\p{L}\p{M}~u', $s, $m)) {
    echo "There is a multibyte char here: " . $m[0];
}

请注意:

  • \p{L} - 匹配任何 Unicode 字母
  • \p{M} - 匹配任何变音符号(组合标记)

u 修饰符启用 (*UTF)(*UCP) PCRE 标志,使 PCRE 引擎在 Unicode 感知模式下处理字符串和模式。

【讨论】:

  • 更好! :-)
【解决方案2】:

这里有一些可能会起作用的东西:

$contents = str_replace(chr(85).chr(249),chr(154), file_get_contents("mycsv.csv"));

然后按照推荐的方式将您的数据库切换到 UTF-8 并执行以下操作:

$utfText = mb_convert_encoding($contents,"UTF-8","ISO-8859-1"); //I think that's the ISO standard you are referring to 

【讨论】:

  • 谢谢。但我们唯一需要的是验证。因此,如果检测到非标准字符,请警告用户。
  • strpos(file_get_contents("mycsv.csv"),chr(85).chr(249)) !== false 将返回 true 如果字符串包含字符 85 后跟字符 249。但是我的 UTF-8 转换建议仍然存在,因为它似乎当前使用的字符集不适用于什么你给它。
【解决方案3】:

Wiktor(第一条评论)成功了。

我们不需要替换,对我们来说只是一个警告就可以了,因为这种情况很少见,无论如何都应该在 CSV 文件中修复。

'~\p{L}\p{M}+~u'

完成这项工作。

【讨论】:

  • 如果它适合你,我可以自己发布一个完整的答案和解释。 “做这项工作”并不是一个真正有用的答案。请参阅下面的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2014-03-17
  • 2016-01-21
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
相关资源
最近更新 更多