如何解决在 phpyii1.1 框架中处理 csv 文件时,爱尔兰口音变成了 wiered 字符
我知道在这个社区中已经有很多类似的问题被问到,但不幸的是没有任何东西对我有用。
我有一个 CSV 表,需要将其导入到我们的系统中。工作表在 Linux 中导入时没有任何问题(使用 Libre Office 创建工作表),即使是爱尔兰字符也是如此。
但主要问题始于 Windows 和 iOS 环境,使用 excel (MS-excel),其中字符编码发生变化。很少有爱尔兰人喜欢
Ž、Ŕ 和许多其他符号正在更改为不同的符号。
P.S :如果我们通过 iOS 中的 Numbers 来创建 CSV,它可以正常工作。
以下是我读取 CSV 表的 php 方法。
$path = CUploadedFile::getInstance($model,'absence_data_file'); // Get the instance of selected file
$target = ['First Name','Last Name','Class','Year','From']; // Valid Header
public static function readCSV($path,$target) {
$updated_header = array();
$data = array();
if ($path->type == 'text/csv' || $path->type == 'application/vnd.ms-excel' || $path->type == 'text/plain' || $path->type == 'text/tsv') {
$fp = fopen($path->tempName,'r');
$encoding_type = mb_detect_encoding(file_get_contents($path->tempName));
if ($fp !== FALSE) {
$header = fgetcsv($fp);
foreach ($header as $h) {
$updated_header[] = $h;
}
$updated_header = array_map( 'trim',array_values($updated_header));
if (array_diff($target,$updated_header)) {
$errormessage = 'Invalid header format.';
return $errormessage;
} else {
while ($ar = fgetcsv($fp)) {
$data[] = array_combine($updated_header,$ar);
}
$data['file_encoding'] = $encoding_type;
return $data;
}
}
} else {
$errormessage = "Invalid File type,You can import CSV files only";
return $errormessage;
}
}
我正在导入的工作表(查看图片):
打印数据(第一条记录)
解决方法
我不确定爱尔兰代码页,但如果是您在评论中提到的西欧,我猜您的代码页将是 ISO-8859-1 或 ISO-8859-14,而您的代码行应该是:
$encoding_type = mb_detect_encoding(file_get_contents($path->tempName),'ISO-8859-1',true);
或者只是简单地跟随,因为您确定它的编码是“ISO-8859-1”
$encoding_type = 'ISO-8859-1'
mb_detect_encoding 中的第二个和第三个参数告诉函数严格尝试使用 ISO-8859-1
进行编码,如果您想同时尝试其他代码页,您可以提供逗号分隔的代码页列表以第二个参数,例如UTF-8,ISO-8859-1
请注意,您需要调用 mb_convert_encoding 以实际获取所需编码的文件,因此以下代码将严格尝试从 ISO-8859-1 解码为 UTF-8
$UTF8_text = mb_convert_encoding($content,'UTF-8','ISO-8859-1');
如果你坚持使用fgetcsv
,看看(mb_internal_encoding)[https://www.php.net/manual/en/function.mb-internal-encoding.php],它会设置默认编码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。