CSV文件中值的奇怪二进制字符串(在Laravel中导入,包含丹麦的æ,ø和å字母)

时间:2019-02-20 13:47:43

标签: php laravel encoding utf-8

我有一个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

2 个答案:

答案 0 :(得分:1)

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

我认为,由于文件中存在某些字符,因此php认为该文件是使用其他字符集(not UTF-8)编码的,或者文件是确实编码为其他字符集,因为您的数据库编码或获取此csv文件的方式。

答案 1 :(得分:0)

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

谢谢大家的时间!每件事都有帮助。