如何将具有“(ISO-8859-1)字符的字符串转换为常规(UTF-8)字符?

8
<li>Jain R.K. and Iyengar S.R.K., “Advanced Engineering Mathematicsâ€, Narosa Publications,</li>

我在数据库中有很多原始的HTML字符串。所有文本都有这些奇怪的字符。我该如何将其转换为普通文本,并保存回数据库中。

$final = '<li>Jain R.K. and Iyengar S.R.K., “Advanced Engineering Mathematicsâ€, Narosa Publications,</li>';
$final = utf8_encode($final);

$final = htmlspecialchars_decode($final);

$final = html_entity_decode($final, ENT_QUOTES, "UTF-8");

$final = utf8_decode($final);

echo $final;

我尝试了以上代码,在网页浏览器中显示正常,但在数据库中仍然保存相同的奇怪字符。

数据库的字符集是UTF-8。

4个回答

11
$final = '<li>Jain R.K. and Iyengar S.R.K., “Advanced Engineering Mathematicsâ€, Narosa Publications,</li>';

$final = str_replace("Â", "", $final);
$final = str_replace("’", "'", $final);
$final = str_replace("“", '"', $final);
$final = str_replace('–', '-', $final);
$final = str_replace('â€', '"', $final);

对于过去的数据,我用UTF-8字符替换了奇怪的字符。

对于将来的数据,我在php、html和数据库连接中设置了字符集为utf8。


10
"“"是""的"Mojibake"。你可以尝试避免使用非ASCII字符,但那只会延迟陷入麻烦的时间。
在您的表格和连接中需要使用utf8mb4。请参见此处,了解Mojibake的可能原因。"

1
我知道一个避免非ASCII字符的用例。在我还是MySQL+PHP开发人员的时候,我们的网站管理员使用了一个第三方工具来备份数据库,但该工具无法正确处理编码。他曾经只能从备份中恢复PROD,结果发现字符已经损坏了。我用HTML实体替换了所有的乱码,这立即解决了我们面向客户的尴尬,而且不需要新的技能、新的流程和很少的风险。我们需要那个牛仔式的hack来给我们争取时间,以便下次做得更好。 - durette

3

SQL修复5个案例,以及对两个无法修复的案例进行评论:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases - Rick James

3

我知道这个问题已经有答案了,但我遇到了同样的问题,并通过修复表中的字符集来解决它,以便未来输入数据。

我正在使用 SQL Server 2017,排序规则设置为SQL_Latin1_General_CP1_CI_AS

对于现有字符,我编写了一个脚本从数据库中提取数据并搜索匹配的每个字符,并修复这些字符。

我创建了两个 CSV 文件,一个包含带有杂乱字符的数据(email_templates.csv),另一个包含干净的 HTML 模板(clean_templates.csv)。

要查找文本/HTML 中的杂乱字符,您也可以使用此在线工具,这非常有帮助。

https://freetools.textmagic.com/unicode-detector

UTF-8编码调试表

https://www.i18nqa.com/debug/utf8-debug.html

HTML代码和HTML特殊字符

https://psdtowp.net/html-codes-special-characters.html

为了在VS Code中验证相同的内容,我使用了扩展程序Render Special Characters,以下是链接。

https://marketplace.visualstudio.com/items?itemName=miku3920.vscode-render-special-chars

PHP脚本以验证和修复问题

$fileName = "email_templates.csv";
$ofileName = "clean_templates.csv";

try {

    $stray_chars = array(
        '—' => '-',
        '–' => '-',
        '‘'=> '\'',
        '’' => '\'',
        '“' => '"' ,
        'â€' => '"',
        'Â'=>'',
        'ó'=> "ó",
        "ñ" => "ñ",
        "Ã" => "í",
        "á"=> "á",
        "" => '',
    );
    
    $contents = getEmailTemplateContent();

    $handle = fopen($fileName, "w") or die('Unable to open file');
    $ohandle = fopen($ofileName, "w") or die('Unable to open file');
    $data = [];
    $cleaned = [];
    $i = 0;

    $html = '';


    foreach($contents as $content) {

        $html = $content['html'];
        $clean = str_replace(array_keys($stray_chars), array_values($stray_chars), $html);

        $cleaned[$i] = $content['id']."-xxxx-".$clean;
        $data[$i] = $content['id']."-xxxx-".$html;
        //Fix stray characters in database
        updateEmailTemplateContent($clean, $content['id']);
        $i++;
    }

    fputcsv($handle, $data);
    fputcsv($ohandle, $cleaned);
    fclose($handle);
    fclose($ohandle);
}
catch(\PDOException $e) {
    $jobStatus = 'E';
    $jobError = $e->getMessage();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接