【问题标题】:Wierd binary-string for values in CSV-file (import in Laravel containing danish æ, ø and å-letters)CSV 文件中值的奇怪二进制字符串(在包含丹麦 æ、ø 和 å 字母的 Laravel 中导入)
【发布时间】:2019-02-20 22:44:21
【问题描述】:

我有一个 Mime 类型的文件:text/csv

我想遍历它并进行一堆字符串操作。

我有十亿列和行。但是一个简单的例子:

Foo    Bar    Grød
------------------
1      2      3
4      5      6

如果我只是直接打印出值,而不做任何事情,那么 Laravel 会打印这个(用于标题):

我的代码:

foreach( $headers as $entry ){
  dump( $entry );
}

输出

Foo
Bar
b"Grød"

现在第三行是问题所在。这是binary-string

但我想要'b"" 里面的内容。所以我想要这样的输出:

Foo
Bar
Grød

如果我只添加utf8_decode,像这样:

foreach( $headers as $entry ){
  dump( utf8_decode( $entry ) );
}

Foo
Bar
Gr?d

?!

如何从包含丹麦 æ、ø 和 å 字母的所有行中获取实际值?它是标准 UTF-8 编码的一部分,所以它应该是火箭科学。

加法1

如果我写:dd( $request['csv_file'] ),那么它会输出:

-test: false
-originalName: "FILENAME.csv"
-mimeType: "text/csv"
-error: 0
#hashName: null
path: "/private/var/folders/hl/r1syq9ys4z30lw08b6g8hhnh0000gn/T"
filename: "phpzYwY9I"
basename: "phpzYwY9I"
pathname: "/private/var/folders/hl/r1syq9ys4z30lw08b6g8hhnh0000gn/T/phpzYwY9I"
extension: ""
realPath: "/private/var/folders/hl/r1syq9ys4z30lw08b6g8hhnh0000gn/T/phpzYwY9I"
aTime: 2019-02-20 15:31:10
mTime: 2019-02-20 15:31:10
cTime: 2019-02-20 15:31:10
inode: 12891860254
size: 2282762
perms: 0100600
owner: 501
group: 20
type: "file"
writable: true
readable: true
executable: false
file: true
dir: false
link: false

我不知道这是否对任何人有帮助。

如果我(在终端中)写file -I FILENAME.csv,那么它会输出:FILENAME.csv: application/octet-stream; charset=binary

【问题讨论】:

  • b"" 只是该dump 实用程序的约定。就 PHP 而言没有区别,PHP 没有任何称为“二进制字符串”的东西。你根本不需要做任何事情。如果您想弄清楚字符串的实际编码是什么,请使用bin2hex 查看它的实际字节表示。
  • 有趣。稍后在代码中,我做了一个 'in_array( 'Grød', $headers );`,这就是失败的那个。无论我是否执行 utf8_decode,它都会失败。所以那封蹩脚的信一定有什么东西! :-)
  • 愚蠢的问题,你在哪里倾销这个价值?您是否在浏览器或其他地方看到 Gr?d 这个?
  • 在浏览器中,是的。所以我写了dump( .... ) 并重新加载页面(在浏览器中)。
  • 如果in_array没有找到,说明你的PHP文件中字符串的编码(即PHP文件的编码),数组中字符串的编码是不同。

标签: php laravel encoding utf-8


【解决方案1】:

尝试将文件的编码更改为UTF-8。对于转换,您可以使用 Notepad++Sublime Text 等文本编辑器。将文件转换为UTF-8 或更好地转换为UTF with BOM,保存并重试。

我想,由于文件中存在某些字符,php 认为该文件是用另一个字符集 (not UTF-8) 编码的,或者文件是 真的 用另一个字符集编码的由于您的数据库编码或您获取此 csv 文件的方式。

【讨论】:

  • 没用。 :-/ 如果我(在终端)写:file -I FILENAME.csv,那么它输出:FILENAME.csv: application/octet-stream; charset=binary。也许这告诉某人一些事情。
  • 尝试使用 BOM 转换为 UTF8
  • 如果我使用UTF8 with BOM 保存,那么它会输出:?Grød。 :-/
【解决方案2】:

This solved 给我。使用unpack( "a*", $entry );

感谢大家的宝贵时间!每一件小事都有帮助。

【讨论】:

  • 我再次建议您在应用此类神秘解决方案之前查看您使用 bin2hex() 实际处理的内容。
猜你喜欢
  • 2021-04-19
  • 2020-03-07
  • 1970-01-01
  • 2021-09-05
  • 2013-02-15
  • 2015-03-04
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多