在 Yii2 中从带有特殊字符的 ANSI 文本文件读取数据会移位值,为什么?

问题描述 投票:0回答:1

我的问题与此线程相关:如何在 Yii2 中使用文本文件作为数据库

我已经设法从结构化 ANSI 编码文本文件(没有 csv,但指定了列的位置和长度)中读取数据,并将它们显示在网格视图中。我已将列 pos 和 len 定义保存到 MySql 表中,以便我可以访问它。现在我正在阅读这些列定义,并且可以成功正确地读取每一列:

foreach ($lines as $line) {
    if (substr($line, 0, 1) === $type) {
        $model = new DynamicModel($dynamicAttributes);
        foreach ($fielddefs as $fielddef) {
            $attributeName = $fielddef->attributes['variable'];
            $value = substr($line, $fielddef->pos, $fielddef->len);
            $model->$attributeName = $value;
        }
        $models[] = $model;
    }
}
return $models;

直到其中一列中出现像 ü、ö 等特殊字符作为示例描述,在这种情况下,下一列中的值会发生移位,因此看来这个 ü 正在以某种方式改变下一列的方式读取列后,位置或长度不再正确定义。我试图使用 mb_convert_encoding() 将整个文件转换为 UTF8,但不幸的是它没有帮助。一旦我删除了这些特殊字符,整个记录、所有列都会被完美读取。你以前有过这样的经历吗?我该如何解决这个问题?谢谢。

文本文件如下所示:

这就是网格视图中的结果:

php yii2
1个回答
0
投票

对于涉及多字节字符的情况,您将需要使用 mb_substring

mb_substr(
    string $string,
    int $start,
    ?int $length = null,
    ?string $encoding = null
): string

供您参考,mb_substr 根据字符数执行多字节安全 substr() 操作。位置是从字符串的开头开始计算的。第一个字符的位置为 0。第二个字符的位置为 1,依此类推。

© www.soinside.com 2019 - 2024. All rights reserved.