当前位置: 首页 > 面试题库 >

检测编码并制作一切UTF-8

卢勇
2023-03-14
问题内容

我正在从各种RSS提要中读取很多文本,并将其插入到数据库中。

当然,提要中使用了几种不同的字符编码,例如UTF-8和ISO 8859-1。

不幸的是,文本的编码有时会出现问题。例:

  1. “Fußball”中的“ß”在我的数据库中应如下所示:“Ÿ”。如果它是“”,则正确显示。

  2. 有时,“Fußball”中的“ß”在我的数据库中看起来像这样:“ß”。然后,当然会显示错误。

  3. 在其他情况下,“ß”另存为“ß”-因此无需进行任何更改。然后它也会显示错误。

我该如何避免情况2和情况3?

如何使所有内容都使用相同的编码,最好是UTF-8?什么时候必须使用utf8_encode(),什么时候必须使用utf8_decode()(很清楚效果是什么,但是什么时候必须使用这些函数?),什么时候我什么都不要做?

如何使所有内容都具有相同的编码?也许具有功能mb_detect_encoding()?我可以为此编写函数吗?所以我的问题是:

  1. 如何找出文字使用的编码方式?
  2. 我如何将其转换为UTF-8-不管旧的编码是什么?

这样的功能会起作用吗?

function correct_encoding($text) {
    $current_encoding = mb_detect_encoding($text, 'auto');
    $text = iconv($current_encoding, 'UTF-8', $text);
    return $text;
}

我已经测试过了,但是没有用。它出什么问题了?


问题答案:

如果应用utf8_encode()到已经存在的UTF-8字符串,它将返回乱码的UTF-8输出。

我做了一个解决所有这些问题的功能。叫做Encoding::toUTF8()

您不需要知道字符串的编码是什么。它可以是Latin1(ISO8859-1),Windows-1252或UTF-8,或者字符串可以混合使用。Encoding::toUTF8()会将所有内容转换为UTF-8。

我之所以这样做,是因为某项服务使我的数据馈送全乱了,在同一字符串中混合了UTF-8和Latin1。

用法:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

下载:

https://github.com/neitanod/forceutf8

我提供了另一个函数,Encoding::fixUFT8()它将修复每个看起来乱码的UTF-8字符串。

用法:

require_once('Encoding.php');
use \ForceUTF8\Encoding;  // It's namespaced now.

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

例子:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

将输出:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

我已将函数(forceUTF8)转换为称为的类上的一系列静态函数Encoding。新功能是Encoding::toUTF8()



 类似资料:
  • 我有一个用ISO-8859-1编码的项目(一个我不能改变的历史性选择)。 我设置我的IDE,IntelliJ 14.1.1终极,在ISO-8859-1无处不在:我的编码设置 (我的代码在ISO-8859-1中指定的文件夹中) 编码。xml看起来不错: 我的idea没有在git上提交,因为它不是标准的IDE。 但当我处理某个文件时,intelliJ会在保存时不断将编码切换到UTF-8。我多次将文件转

  • 我有一个编码问题。 我有数百万个文本文件需要为语言数据科学项目进行解析。每个文本文件都编码为UTF-8,但我刚刚发现其中一些源文件的编码不正确。 例如我有一个中文文本文件,编码为UTF-8,但文件中的文本如下所示: 当我使用Python检测此中文文本文件的编码时: Chardet告诉我文件编码为UTF-8: UnicodeDammit还告诉我该文件编码为UTF-8: 同时,我知道这不是UTF-8,

  • 问题内容: 我将承担将数据库从Latin1转换为UTF-8的繁琐而棘手的任务。 在这一点上,我只想检查存储在表中的数据类型,因为这将确定我应使用哪种方法转换数据。 具体来说,我想检查Latin1列中是否有UTF-8字符,什么是最好的方法?如果只影响几行,那么我可以手动修复它。 选项1.执行MySQL转储并使用Perl搜索UTF-8字符吗? 选项2。使用MySQL CHAR_LENGTH查找具有多字

  • 问题内容: 我想从请求中获取参数(带有重音符的字符),但是它不起作用。我尝试使用,但也没有用。 我知道返回正确的字符,但不起作用! 有人有主意吗? 问题答案: Paul的建议似乎是最好的做法,但如果要解决此问题,则根本不需要URLEncoder或URLDecoder: 更新: 由于获得了很多选票,我想强调BalusC的观点,即这绝对不是解决方案。充其量是一种解决方法。人们不应该这样做。 我不知道是

  • 问题内容: 我正在用python做一些脚本。我创建一个保存在文件中的字符串。这个字符串有很多数据,来自目录的树状结构和文件名。根据convmv的介绍,我所有的树状结构都是UTF-8。 我想将所有内容都保留在UTF-8中,因为之后我将其保存在MySQL中。现在,在UTF-8的MySQL中,我遇到了一些字符问题(例如é或è-我是法语)。 我希望python始终将字符串用作UTF-8。我在互联网上阅读了

  • 这是我第一次用MSSQLServer作为数据库为我的项目实现Liquibase(3.8.1版)。 我正在尝试为现有的sql server数据库设置基线,该数据库包含许多表、视图、存储过程和函数。 我成功地为表格生成了Angelog。 由于我所做的有很多存储过程、视图和函数,所以我从MSSQLSERVER生成了SQL脚本- 在使用liquibase update执行上述更改日志时,我收到错误“运行l