我正在从各种RSS提要中读取大量文本,并将它们插入到我的数据库中.

Of course, there are several different character encodings used in the feeds, e.g. UTF-8 and ISO 8859-1.

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

  1. 在我的数据库中,"Fuüball"中的"«"应该是这样的:"Ÿ".如果是"Ÿ",则显示正确.

  2. 有时,"Fußball"中的"ß"在我的数据库中看起来像这样:"ß".当然,它会被错误地显示出来.

  3. 在其他情况下,"ß"保存为"ß"——因此没有任何更改.然后它也被错误地显示.

我能做些什么来避免 case 2和 case 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;
}

我测试过了,但它不工作.有什么问题吗?

推荐答案

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

我创建了一个函数来解决所有这些问题.它叫Encoding::toUTF8().

您不需要知道字符串的编码是什么.它可以是Latin1(ISO 8859-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().

Php相关问答推荐

Woocommerce将自定义数据添加到自定义文件中购物车中的产品

PHP -使用preg_match在字符串中进行匹配

从WooCommerce邮箱通知中的订单详细信息中删除产品列表

如何让PHP变量跨越多个脚本调用?

Laravel eloquent-如果没有包含InitialValue的结果,则查询where Second Value

列出所有WooCommerce处理订单中的产品数量,SKU和品牌

Chillerlan/php-iOS名称字段的QR vCard错误

根据WooCommerce Cart小计阈值自动应用优惠券

无法在Laravel中将日志(log)通道设置为空

即使在WooCommerce购物车中添加了两次产品,也要将所有项目设置为空白行

为什么PHP PDO忽略NOT NULL约束?

$this->;db->;update();CodIgnitor中的功能不工作

在 WooCommerce 订阅续订订单中设置送货方式

如何正确判断 PHP 是否已正确配置为使用 DOMDocument?

基于WooCommerce中的产品变体自定义感谢页面跳转

WooCommerce checkout 流程中基于所选选项添加自定义费用

ACF 更新字段功能不更新 WordPress 中的任何数据

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

如何故意创建不同的错误(404,500,419)? Lavravel PHP

为什么在 phpunit 的开头测试 PHP_VERSION?