在 PHP 中读取带有全角字符的日文字符时出现问题

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

我有一个 PHP 程序,它从库存扫描仪中读取某个文件。 数据像这样在 1 行中流式传输。

3701804901070125616シャルダン ステキプラスクルマ専用 ジャスミンマリアシャルダン ステキプラスクルマ ジ2131970080                 16033001383701804902720123549森永IQサポート もも&りんご 125ml×3     モリナガIQサポート モモ&リンゴ1901030080                 16033001383701804987072042557噛むブレスケア マスカット 25粒                 ブレスケアカム 25T マスカット  2121070080                 16033001383701804987072042564噛むブレスケアボトル マスカット 80粒ボトル     ブレスケアカムボトル マスカット  2121070080                 1603300138```

These can be separated by every 128bytes. Like this

[Inventory Scanner](https://i.stack.imgur.com/Q3gtX.png)


SO here is my PHP that reads the file.


$fp = fopen($vanReadfile, "r");

flock($fp, LOCK_SH);    
flock($fp, LOCK_UN);
$vandataBuf= fgets($fp); //fgets since only 1 continously line
$convertBufstring = mb_convert_encoding($vandataBuf, "UTF-8","Shift-JIS"); 

            $tenpo_cd       =mb_substr($convertBufstring,$i+0,3,"UTF-8");
            $chiku_cd       =mb_substr($convertBufstring,$i+3,2,"UTF-8");
            $shori_kbn      =mb_substr($convertBufstring,$i+5,1,"UTF-8");
            $jan_cd         =mb_substr($convertBufstring,$i+6,13,"UTF-8");

            $prod_nm        =mb_substr($convertBufstring,$i+19,52,"UTF-8");   
            $prod_kn        =mb_substr($convertBufstring,$i+71,20,"UTF-8");

            $jicfs_class_cd =mb_substr($convertBufstring,$i+91,6,"UTF-8");
            $prod_tax       =mb_substr($convertBufstring,$i+97,3,"UTF-8");
            $regi_duty_kbn  =mb_substr($convertBufstring,$i+100,1,"UTF-8");
            $auto_order_kbn =mb_substr($convertBufstring,$i+101,1,"UTF-8");
            $spacex16       =mb_substr($convertBufstring,$i+102,16,"UTF-8");```

使用上面的代码,文件的输出看起来像这样。

天宝:370

简光盘:4901070125616

prod名称:シャルダンシャルダンプラスクルマ専用マリアシャルダン マリアシャルダン ステキ プラスクルマ ジ213197

产品名称 KN:0080

JICFS 课程光盘:16033

REGI DUTY KBN:3

自动订购 KBN:8

空间 3701804902720123

我想要的输出应该是这样的:

天宝:370

简光盘:4901070125616

产品名称: シラドンドステキプラスクルママス用ドジュアスミンマリア

产品名称 KN: `ャルダンステキプラスクルマジ

JICFS 课程光盘:213197

REGI DUTY KBN:3

自动订购 KBN:8

SPACE(这里有 16 个空格)

所有其他 substr() 都是正确的。问题出在阅读产品名称(全角)时。该程序有时读取更少或更多。

这里有一个例子:

シュラドンドステキプラスクルマイ〸ガスミンマリア
<--- this is 26 characters(72bytes)

森永IQsaポートも&りん 125mm×3
<--- this is 28 characters(200bytes)

有了这个,我已经不知道如何处理这个了。 任何人都可以提出解决方案吗?

我尝试使用

mb_convert_encoding($vandataBuf, "UTF-8","Shift-JIS"); 

它没有完成工作。

我还尝试调整这段代码读取的字符数并将其更改为 26 个字符。它在第一行工作,因为它有 26 个字符,但它读错了第二行,它有 28 个字符

$prod_nm        =mb_substr($convertBufstring,$i+19,26,"UTF-8");  

我也尝试将所有全角字符转换为半角字符,但字符数也发生变化,因此不一致。

$convertBufstring = mb_convert_kana($convertBufstringBEFORE, "KansC");

$prod_nm        =mb_strcut($convertBufstring,$i+19,52,"UTF-8"); 

我已经没主意了。任何人都可以提出建议吗?也许我错过了什么。

php utf-8 cjk non-ascii-characters
© www.soinside.com 2019 - 2024. All rights reserved.