我有一个 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");
我已经没主意了。任何人都可以提出建议吗?也许我错过了什么。