如何在 mysql 或 php 中将 'u00e9' 转换为 utf8 字符?

Posted

技术标签:

【中文标题】如何在 mysql 或 php 中将 \'u00e9\' 转换为 utf8 字符?【英文标题】:How to convert 'u00e9' into a utf8 char, in mysql or php?如何在 mysql 或 php 中将 'u00e9' 转换为 utf8 字符? 【发布时间】:2011-10-27 01:00:37 【问题描述】:

我正在对一些正在导入 mysql 的杂乱数据进行数据清理。

数据包含“伪”unicode 字符,这些字符实际上以“u00e9”等形式嵌入到字符串中。

所以一个字段可能是.. 'Jalostotitlu00e1n' 我需要撕掉那个笨拙的'u00e1n'并用相应的utf字符替换它

我可以在任一 mysql 中执行此操作,可能使用子字符串和 CHR,但我通过 php 预处理数据,所以我也可以在那里执行。

我已经知道如何配置 mysql 和 php 来处理 utf 数据。问题实际上只是在我正在导入的源数据中。

谢谢

【问题讨论】:

没有“UTF-8 字符”这样的东西。也许您的意思是“具有该代码点的 Unicode 字符的 UTF-8 编码”。 @Ignacio 确实,但我会将“UTF-8 字符”定义为“编码 Unicode 字符的一、二、三或四个字节的序列”。这会是一个有效的定义吗? @deceze:技术上称为“UTF-8 序列”。 【参考方案1】:

我的 twitter 时间线脚本将 é 等特殊字符返回到 \u00e9,因此我去掉了反斜杠并使用了@rubbude his preg_replace。

// Fix uxxxx charcoding to html
$text = "De #Haarstichting is h\u00e9t medium voor alles Into:  De #Haarstichting is hét medium voor alles";
$str     = str_replace('\u','u',$text);
$str_replaced = preg_replace('/u([\da-fA-F]4)/', '&#x\1;', $str);

echo $str_replaced;

它对我有用,它变成了: De #Haarstichting is h\u00e9t medium voor alles 进入: De #Haarstichting is hét medium voor alles

【讨论】:

不!不要从\u 中去掉反斜杠,因为它可以用作标识符。改用修改后的正则表达式preg_replace('/\\u([\da-fA-F]4)/', '&#x\1;', $str) 对,这就是我需要的。当然我的剥离是错误的,它剥离了我唯一的标识符。谢谢@rabbude,我今晚正在测试这个,并将用你的 preg_replace 更新这个答案。 对@rabbude,现在我记得为什么我自己没有使用 \\u:Warning: preg_replace() [function.preg-replace]: Compilation failed: PCRE does not support \L, \l, \Nname, \U, or \u at offset 1 对不起,这可能是我的错,尝试双重逃避它:preg_replace('/\\\\u([\da-fA-F]4)/', '&#x\1;', $str)【参考方案2】:

/* 用于将 utf8 html 转换为 ansi 的函数 php */

public static function Utf8_ansi($valor='') 

    $utf8_ansi2 = array(
    "\u00c0" =>"À",
    "\u00c1" =>"Á",
    "\u00c2" =>"Â",
    "\u00c3" =>"Ã",
    "\u00c4" =>"Ä",
    "\u00c5" =>"Å",
    "\u00c6" =>"Æ",
    "\u00c7" =>"Ç",
    "\u00c8" =>"È",
    "\u00c9" =>"É",
    "\u00ca" =>"Ê",
    "\u00cb" =>"Ë",
    "\u00cc" =>"Ì",
    "\u00cd" =>"Í",
    "\u00ce" =>"Î",
    "\u00cf" =>"Ï",
    "\u00d1" =>"Ñ",
    "\u00d2" =>"Ò",
    "\u00d3" =>"Ó",
    "\u00d4" =>"Ô",
    "\u00d5" =>"Õ",
    "\u00d6" =>"Ö",
    "\u00d8" =>"Ø",
    "\u00d9" =>"Ù",
    "\u00da" =>"Ú",
    "\u00db" =>"Û",
    "\u00dc" =>"Ü",
    "\u00dd" =>"Ý",
    "\u00df" =>"ß",
    "\u00e0" =>"à",
    "\u00e1" =>"á",
    "\u00e2" =>"â",
    "\u00e3" =>"ã",
    "\u00e4" =>"ä",
    "\u00e5" =>"å",
    "\u00e6" =>"æ",
    "\u00e7" =>"ç",
    "\u00e8" =>"è",
    "\u00e9" =>"é",
    "\u00ea" =>"ê",
    "\u00eb" =>"ë",
    "\u00ec" =>"ì",
    "\u00ed" =>"í",
    "\u00ee" =>"î",
    "\u00ef" =>"ï",
    "\u00f0" =>"ð",
    "\u00f1" =>"ñ",
    "\u00f2" =>"ò",
    "\u00f3" =>"ó",
    "\u00f4" =>"ô",
    "\u00f5" =>"õ",
    "\u00f6" =>"ö",
    "\u00f8" =>"ø",
    "\u00f9" =>"ù",
    "\u00fa" =>"ú",
    "\u00fb" =>"û",
    "\u00fc" =>"ü",
    "\u00fd" =>"ý",
    "\u00ff" =>"ÿ");

    return strtr($valor, $utf8_ansi2);      


【讨论】:

【参考方案3】:

有办法。用它们的 HTML 表示替换所有 uXXXX 并执行 html_entity_decode()

echo html_entity_decode("Jalostotitlán");

u1234 形式的每个 UTF 字符都可以在 HTML 中打印为ሴ。但是进行替换非常困难,因为如果没有其他字符可以识别 UTF 序列的开头,则可能会出现很多误报。一个简单的正则表达式可以是

preg_replace('/u([\da-fA-F]4)/', '&#x\1;', $str)

【讨论】:

谢谢,我没想到的好简单的解决方案。我认为使用它是安全的,因为我试图修复的数据中不应包含任何数字。他们这样做的唯一原因是因为混乱的UTF,所以这些应该很容易识别 小心!除非您的数据确实受到限制,否则您无法从如此糟糕的数据损坏中可靠地恢复。例如,将任何 u-hex-hex-hex 序列作为损坏的 Unicode 转义符,会将“说服”这个词变成“pers귭”... @bobince 正确,这就是为什么我写它不太容易,因为“误报”。拥有一个标识符非常重要。 我的 twitter 时间线脚本将 é 之类的特殊字符返回到 \u00e9 中,这样我就可以使用反斜杠作为标识符了,对吧? 是的,这比没有标识符要好得多。所以你可以将正则表达式修改为preg_replace('/\\u([\da-fA-F]4)/', '&#x\1;', $str)(注意反斜杠被转义了)

以上是关于如何在 mysql 或 php 中将 'u00e9' 转换为 utf8 字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中将时间作为输入?

如何使用 PHP 在 MySQL 数据库中将纯文本 CSV 字段保存为 HTML?

如何在 php 中将默认输入值设置为 0.00? [复制]

如何在php/codeigniter或mysql中获得两个相差20分钟的日期的所有组合

Php fopen或fwrite使用unicode创建文本

在查询中将 DateTime.Ticks 转换为 MySQL DateTime