半个字? - 口音编码问题

时间:2014-05-05 08:39:09

标签: php encoding utf-8

我在处理html源代码时遇到了一个非常奇怪的编码问题。 我得到以下一行:

  

“requêteprésentéepar......”

当extern库执行utf8_decode时,我得到了:

  

“reque ^teprésente'epar ...”

所以重音符号放在重音符号上。如果我从那个结果中做了一个utf8_encode,我就不会得到原来的“requêteprésentéepar......”但是我仍然保持“reque ^teprésente'epar ...”

更奇怪的是:如果我在Notepad ++中打开原始html,编码是没有BOM的utf8(到目前为止,那么好),但我实际上可以通过文本选择(键盘或鼠标)选择一半的字符。是的,一半。好像真正的代码是“e ^”但它显示为“ê”。当我尝试将其复制到我的IDE时,它会复制“ê”但粘贴“e ^”。

我想出了一个基本的替换功能:

“e ^”=> “E”, “e'”=> “E” ...

以及其他一些法国案例,它现在正常运作。 但由于HTML有不同的语言,我很确定在这个编码问题下我无法成功替换每个字符。

之前是否有人面对此问题并且(希望)有更一般的解决方案?

提前致谢。

1 个答案:

答案 0 :(得分:1)

听起来您的HTML源正在使用Combining characters。也就是说,不是使用单个unicode字符来表示ê,而是首先使用常规e,然后使用组合字符来添加变音符^。您可以使用十六进制编辑器验证这一点以查看字符代码,在这种情况下,组合的circumflex是十六进制代码0302。

另见Unicode equivalence