- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我制作了一个 PHP 脚本,用于生成之前由另一个进程生成的 CSV 文件。然后,必须通过另一个过程导入 CSV 文件。
旧 CSV 文件的导入工作正常,但在导入新 CSV 文件时出现特殊字符问题。
当我用 Notepad++ 打开旧的 CSV 时,它说编码是 UTF-8,而当我用它打开新的 CSV 时,它说它们的编码是“ANSI as UTF-8”。
两者有什么区别?
我怎样才能使 fopen 和 fputcsv 使用“纯”? UTF-8编码?
谢谢!
最佳答案
文件没有问题。 “ANSI as UTF-8”表示没有 BOM,但 Notepad++ 通过分析字节模式明确地将编码识别为 UTF-8。我通过创建一个包含俄语、希腊语和波兰语文本的文件并将其保存为不带 BOM 的 UTF-8 格式来对此进行测试。在这里:
# Russian
Следующая
# Greek
Επόμενη
# Polish
Więcej
我在不同的编辑器 (EditPad Pro) 中执行此操作并使用十六进制模式来确保 BOM 不存在。当我在 NPP 中打开它时,它显示编码为“ANSI as UTF-8”并且所有字符都正确显示。然后,仍然在十六进制模式下,我删除了第一个俄语字符的第一个字节。当我再次在 NPP 中打开它时,它显示编码为“ANSI”并将文本的非 ASCII 部分显示为 mojibake。 :
; Russian
¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ
; Greek
Επόμενη
; Polish
Więcej
回到EditPad,这次我添加了一个BOM但是没有修复Cyrillic字符。这次 NPP 报告编码为“UTF-8”,除第一个俄语字符外,所有内容均正确显示,如下所示。 “A1”是 UTF-8 中该字符的第二个字节的十六进制表示。它以倒置的配色方案显示以指示错误。
# Russian
A1ледующая
# Greek
Επόμενη
# Polish
Więcej
总结一下:在没有 BOM 的情况下,Notepad++ 会查找不能表示 ASCII 字符的字节,因为它们的值大于 127(或 7F
十六进制)。如果找到任何内容,但它们都符合 UTF-8 要求的模式,它将文件解码为 UTF-8,并在状态栏中报告编码为“ANSI as UTF-8”。
但是如果它发现即使有一个字节不符合 UTF-8 行,它也会将文件解码为“ANSI”,这意味着底层平台的默认单字节编码。如果您的文件已损坏,您将看到这种情况。
编辑:尽管您的文件没有它也是有效的,但是您可以通过在文件的最开头手动写入三个字节 "EF BB BF"
来添加 BOM --但应该有更好的方法。您现在如何生成内容?因为它是 UTF-8,其中某处至少有一个非 ASCII 字符;否则,NPP 会将其报告为“ANSI”。
要考虑的另一种可能性:如果您对使用 CSV 文件的进程有任何影响,也许您可以将其配置为期望没有 BOM 的 UTF-8。从技术上讲,任何可以 BOM 而没有 的 BOM 解码 UTF-8 的软件都被破坏了。 Unicode 联盟实际上不鼓励使用 UTF-8 BOM,并不是说任何人都在听。
关于php - 什么是 "ANSI as UTF-8"以及如何使 fputcsv() 生成带 BOM 的 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380690/
这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件。 复制代码代码如下: // 输出Excel文件头,可把user.csv换成你要的文件名
使用此代码,我创建了 CSV 导出文件: foreach ($data_for_export as $row) { $data = []; array_push($data, $row
我在使用 fputcsv 导出 CSV 文件时遇到一些问题。文件已下载,但内容为空。我尝试导出到 xls,它工作得很好,但我想使用带有自定义字段标题的 csv,如下面的代码所示。我不确定我是否做错了什
我有这段 PHP 代码,旨在从 mySQL 数据库检索数据,并将其导出到 CSV 文件,该文件在创建后必须自动下载。 $connection = mysqli_connect($host, $user
我有一个加密和存储用户条目的表单。然后,我有一个导出功能,允许管理员解密并导出所有条目的 csv。 它解密得很好,如果我将数组打印到页面上,一切看起来都很好,但是当我生成 CSV 时,它会在一些数据后
我正在使用这个 fputcsv 代码: $result = mysql_query('SELECT * FROM `mash`'); if (!$result) die('Couldn\'t fetc
我正在使用 PHP 脚本从结果集查询生成 Excel CSV 文件。一切正常,但当我读取我的 excel 文件时,我无法显示前导零。 这是我的代码: $rows = $this->Query($sql
我正要提出与此处提出的问题相同的问题.... Forcing fputcsv to Use Enclosure For *all* Fields 问题是 When I use fputcsv to w
我想将我的 mysql 数据库的部分(和不同排列)保存在 CSV 文件中。为此,我写了这段代码: $headerDisplayed = false; foreach ($arr as &$currNa
我正在开始一个项目,该项目需要我获取多个数组并将它们放入一个 csv 文件中。然而,虽然它正在生成文件,但它通常是完全空的(0 b 文件大小)。有时,如果我遗漏了什么,它会将错误消息放入文件中,或者有
这一定很简单...按照这里和 php.net 上的示例,我尝试从 mysql 查询中获取记录,将它们转换为 csv 格式,并将此数据分配给变量以供程序使用我创造了。我想在不创建临时文件的情况下完成此操
我用 fputcsv 生成 csv 文件,它工作得很好,但是当我在记事本 (Windows) 中查看 csv 文件时,没有新行。所有行都只有 1 行,在应该换行的地方有一个正方形(损坏的字符)。例如,
所以我正在尝试使用 fputcsv,它可以正常工作,几乎就像它的意图一样。我有这个奇怪的问题,我似乎无法解决,而且我找不到任何好的文档,甚至找不到遇到这个问题的人。 当有一个字符串被放入 csv 中时
我在 PHP 中使用 fputcsv 输出数据库查询的逗号分隔文件。在 Ubuntu 的 gedit 中打开文件时,它看起来是正确的——每条记录都有一个换行符(没有可见的换行符,但你可以看出每条记录是
所以我有一行我想对其执行 fputcsv,它有一些整数(我需要将其视为字符串,但它们是数字)。这些整数有前导零,当我执行 fputcsv 时它们会被截断,但我不希望这种情况发生,有什么办法可以解决这个
我一直在使用 PHP 脚本从使用 MySQL 查询的表中导出一些数据,然后想从表中删除这些数据。下面的脚本将数据导出到 CVS 文件。到目前为止它工作正常,但我想添加一个条件来知道如果所有数据都已成功
我正在寻找一种即时导出到 csv 的方法并遇到了这个问题。 $list = array ( array('aaa', 'bbb', 'ccc', 'ddd
未在 csv 文件中输出任何内容。请帮忙!! 这个print_r($list)。 以正确的格式输出数据库中的所有内容但是当我尝试将其放入csv文件中时,仅输出一行。 $sql = "select *
我想将数据从数据库导出到 CSV 文件。 我的PHP代码是这样的 $members = Db::getResult('select * from '.MEMBERS_TABLE_NAME.' orde
嘿,我正在尝试使用数组中的值填充 csv。我怎样才能做到这一点? $sql = "SELECT accountNumber, Name,studentManager,contract,
我是一名优秀的程序员,十分优秀!