数据库表中的特殊unicode问号字符

时间:2015-01-12 13:46:44

标签: sql database unicode utf-8 special-characters

首先,任何阅读此内容并回复的人都会感谢您的帮助。

我遇到一个问题,我有一个网站(主要是英文),有很多不同语言的翻译。我有一个存储这些翻译的数据库。不幸的是,其中一种语言似乎在每个一般字符之间填充了问号字符。因此,任何包含这些字符的文本都不会出现在IE中。

是否有任何SQL语句会搜索这些字符并删除它们?有一个查找/替换选项,但我似乎无法找到适用的规则。

感谢您提供任何帮助。

例如,这就是文本在表格中的显示方式:

i O N k i t d e s u p p o r t V é l o - 停止它显示IE。

如下所示删除它们将在IE中显示: iON kit de支持Vélo

知道我怎么回事吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

您的翻译数据库包含错误解释的数据,这些数据来自于错误解释UTF-16编码的输入为ISO-8859-1(或密切相关的Windows代码页1252;您无法区分示例数据)。 / p>

您可以尝试通过提取数据来解除损坏,将数据编码回原来的字节集,然后重新解码,然后将其重新插入数据库。例如在PHP中:

$mangled = "i\0O\0N\0 \0k\0i\0t\0 \0d\0e\0 \0s\0u\0p\0p\0o\0r\0t\0 \0V\0\xE9\0l\0o\0"
$fixed = iconv('utf-16le', 'utf-8', $mangled)
# "iON kit de support V\xC3\xA9lo"

但最好回到原始输入数据并真正重新导入。

从UTF-16编码的字节字符串(str_replace("\0", '', $mangled))中删除零字节并不是真正修复它,它适用于ASCII字符(U + 0000-U + 007F)但你会结束字符U + 0080-U + 00FF的ISO-8859-1字节(更常见的是你需要UTF-8),超出该范围的任何其他字符都是不可读的废话。