gpt4 book ai didi

php - 如何通过 php 检测和修复 mysql 数据库中的字符编码?

转载 作者:可可西里 更新时间:2023-11-01 06:42:25 25 4
gpt4 key购买 nike

我收到了这个充满法语人名和数据的数据库,这意味着使用 é、è、ö、û 等字符。大约 3000 个条目。

显然,里面的数据有时使用 utf8_encode() 编码,有时不使用。这会导致输出困惑:字符在某些地方显示良好,而在其他地方则不然。

起初我试图追踪 UI 中出现这些问题的每个地方,并在必要时使用 utf8_decode(),但这确实不是一个可行的解决方案。

我做了一些测试,没有理由首先使用 utf8_encode,所以我宁愿删除所有这些,只在所有地方使用 UTF8 - 在浏览器、中间件和数据库级别。所以我需要清理数据库,将所有编码错误的数据转换为清理后的版本。

问题:是否可以在 php 中创建一个函数来检查 utf8 字符串是否已正确编码(不使用 utf8_encode)或不正确(使用 utf8_encode),如果是,则将其转换回其原始状态?

换句话说:我想知道如何检测 utf8_encode() 的 utf8 内容到不是 utf8_encode()d 的 utf8 内容。

**更新:例子**

这是一个很好的例子:您获取一个充满特殊字符的字符串,并获取该字符串的副本并对其进行 utf8_encode()。我梦寐以求的函数接受两个字符串,保留第一个字符串不变,第二个字符串现在与第一个字符串相同。

我试过这个:

$loc_fr = setlocale(LC_ALL, 'fr_BE.UTF8','fr_BE@euro', 'fr_BE', 'fr', 'fra', 'fr_FR');
$str1= "éèöûêïà ";
$str2 = utf8_encode($str1);

function convert_charset($str) {
$charset= mb_detect_encoding($str);
if( $charset=="UTF-8" ) {
return utf8_decode($str);
}
else {
return $str;
}
}
function correctString($str) {
echo "\nbefore: $str";
$str= convert_charset($str);
echo "\nafter: $str";
}

correctString($str1);
echo('<hr/>'."\n");
correctString($str2);

这给了我:

before: éèöûêïà after: ������� 
before: éèöûêïà after: éèöûêïà

谢谢,

亚历克斯

最佳答案

从问题中您目前正在查看的字符编码镜头(这取决于您的文本编辑器、浏览器标题、数据库配置等的默认值)以及数据具有哪些字符编码转换的问题并不完全清楚经历了。例如,通过调整数据库配置,一切都会得到纠正,这比对数据进行零星更改要好得多。

看起来可能是 utf8 双重编码的问题,如果是这种情况,原始数据和损坏的数据都将是 utf8,因此编码检测不会为您提供所需的信息。这种情况下的方法需要假设哪些字符可以合理地出现在您的数据中:就 PHP 和 Mysql 而言,“É”是完全合法的 utf8,因此您必须根据您对数据及其作者,它必须被破坏。如果您只是一名技术人员,做出这些假设是有风险的。幸运的是,如果您知道数据是法语的并且只有 3000 条记录,那么做出这些假设可能没问题。

下面是一个脚本,您可以首先修改它来检查您的数据,然后更正它,最后再次检查它。它所做的只是将字符串处理为 utf8,将其分解为字符,并将这些字符与预期法语字符的白名单进行比较。如果字符串不在 utf8 中或包含法语中通常不期望的字符,则表示存在问题,例如:

PROBABLY OK     Côte d'Azur
HAS NON-WHITELISTED CHAR Côte d'Azur 195,180 ô
NON-UTF8 C�e d'Azur

这是脚本,您需要从 http://hsivonen.iki.fi/php-utf8/ 下载依赖的 unicode 函数

<?php

// Download from http://hsivonen.iki.fi/php-utf8/
require "php-utf8/utf8.inc";

$my_french_whitelist = array_merge(
range(0,127), // throw in all the lower ASCII chars
array(
0xE8, // small e-grave
0xE9, // small e-acute
0xF4, // small o-circumflex
//... Will need to add other accented chars,
// Euro sign, and whatever other chars
// are normally expected in the data.
)
);

// NB, whether this string literal is in utf8
// depends on the encoding of the text editor
// used to write the code
$str1 = "Côte d'Azur";
$test_data = array(
$str1,
utf8_encode($str1),
utf8_decode($str1),
);

foreach($test_data as $str){
$questionable_chars = non_whitelisted(
$my_french_whitelist,
$str
);
if($questionable_chars===true){
p("NON-UTF8", $str);
}else if ($questionable_chars){
p(
"HAS NON-WHITELISTED CHAR",
$str,
implode(",", $questionable_chars),
unicodeToUtf8($questionable_chars)
);
}else{
p("PROBABLY OK", $str);
}
}

function non_whitelisted($whitelist, $utf8_str){
$codepoints = utf8ToUnicode($utf8_str);
if($codepoints===false){ // has non-utf8 char
return true;
}
return array_diff(
array_unique($codepoints),
$whitelist
);
}


function p(){
$args = func_get_args();
echo implode("\t", $args), "\n";
}

关于php - 如何通过 php 检测和修复 mysql 数据库中的字符编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1503020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com