”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 将 JSON 导出为 CSV:关于 CSV 和 Unicode 的说明

将 JSON 导出为 CSV:关于 CSV 和 Unicode 的说明

发布于2024-08-01
浏览:287

Export JSON to CSV: a note on CSV and Unicode

有多个JS库允许导出到excel。但是,如果我们想遵循极简主义方法来避免额外的依赖,该怎么办?

最简单的方法是从 JSON 生成 CSV,可以轻松地在 Excel 中打开。

但在展示转换逻辑之前,让我们先了解一下 CSV 是什么以及创建 CSV 文件时应使用哪种编码。

CSV 格式

此 RFC 4180 逗号分隔值 (CSV) 文件的通用格式和 MIME 类型指定 CSV 格式的定义。请注意,这只是一个备忘录,因为 CSV 格式尚未正式标准化。

主要定义

  1. 每条记录位于单独的行上,由换行符 (CRLF) 分隔。
  2. 文件中的最后一条记录可能有也可能没有结束换行符。
  3. 整个文件中标头应包含相同数量的字段。
  4. 每个字段可以用双引号括起来,也可以不用双引号括起来。
  5. 包含换行符 (CRLF)、双引号和逗号的字段应括在双引号中。
  6. 如果使用双引号括住字段,则字段内出现的双引号必须通过在其前面加上另一个双引号来转义。

编码

在我的 JSON 数据中,我有来自 ISO Latin-1 (ISO/IEC 8859-1) 字符集的字符 æ å ø,创建 csv 文件时必须考虑这些字符。

需要考虑的 Unicode® 标准版本 15.0 的一些摘录。

Unicode 与 UTF-8/16/32

来自 Unicode® 标准版本 15.0:

  • Unicode 是书面字符和文本的通用字符编码标准,包含来自世界各地文字的 149,186 个字符。
  • Unicode 字符以三种编码形式之一表示:32 位形式 (UTF-32)、16 位形式 (UTF-16) 和 8 位形式 (UTF-8)。
  • Unicode 联盟完全认可使用三种 Unicode 编码形式中的任何一种作为实现 Unicode 标准的一致方式。例如,重要的是不要陷入试图区分“UTF-8 与 Unicode”的陷阱。 UTF-8、UTF-16 和 UTF-32 都是实现 Unicode 标准编码字符的同等有效且一致的方法。

字节顺序标记 (BOM)

  • 用于字节顺序标记的字符 U FEFF (UTF-8 EF BB BF) 被命名为零宽度无中断空格。
  • Unicode 纯文本的 UTF-16 和 UTF-32 编码形式对将数据写入文件时使用的字节顺序敏感。
  • a开头的字节序列标识 数据流可以被视为数据流正在使用 UTF-8 编码方案的近乎确定的指示。

简而言之,在 CSV 字符串之前添加零宽度不间断空格将强制 Excel 应用 UTF-8 编码而不是 1252:西欧 (Windows) 或 Excel 在 U FEFF 字符为以下情况时将选择的其他编码不提供。

我将在本系列的下一篇文章中展示使用零宽度不间断空格生成 CSV 文件和不使用零宽度不间断空格的 CSV 文件之间的区别...

版本声明 本文转载于:https://dev.to/andrewelans/export-json-to-csv-what-is-csv-and-unicode-2341?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • HTML 格式标签
    HTML 格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-01-14
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2025-01-14
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2025-01-14
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2025-01-14
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2025-01-14
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2025-01-14
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2025-01-14
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2025-01-14
  • 插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入记录时如何解决“一般错误:2006 MySQL 服务器已消失”介绍:将数据插入 MySQL 数据库有时会导致错误“一般错误:2006 MySQL 服务器已消失”。当与服务器的连接丢失时会出现此错误,通常是由于 MySQL 配置中的两个变量之一所致。解决方案:解决此错误的关键是调整wait_tim...
    编程 发布于2025-01-14
  • 为什么将 Const 对象传递给非常量成员函数会导致 C++ 中的限定符取消资格错误?
    为什么将 Const 对象传递给非常量成员函数会导致 C++ 中的限定符取消资格错误?
    将常量对象作为“this”参数传递:限定符取消资格错误在 C 中,将常量对象作为“this”参数传递给成员函数可能会导致“将‘const xxx’作为成员函数的‘this’参数传递会丢弃限定符”错误。出现这种情况是因为编译器考虑到非常量成员函数可能修改对象的可能性,而对于const对象是禁止这样做的...
    编程 发布于2025-01-14
  • 圆形光标 Js #GSAP
    圆形光标 Js #GSAP
    一个简单的 JavaScript 脚本,用于为个人项目创建交互式圆形光标。重量轻且易于集成,它通过流畅的动画和现代感增强了视觉体验。请根据您的需要随意修改和定制:) 查看Github上的源代码
    编程 发布于2025-01-13
  • 如何使用 SQL 查询检索 MySQL 列名?
    如何使用 SQL 查询检索 MySQL 列名?
    使用 SQL 查询从 MySQL 表中检索列名要在 PHP 中将 MySQL 表中的所有列名提取到数组中,可以使用以下 SQL 查询:SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA`='yo...
    编程 发布于2025-01-13
  • 带平滑滚动的返回顶部按钮
    带平滑滚动的返回顶部按钮
    长页面上的“回到顶部”按钮是一个简单而实用的导航功能。此按钮使用户无需过度滚动即可快速返回页面顶部。 查看以下 Codepen 演示: 全文:带平滑滚动的回到顶部按钮 CSS 代码片段
    编程 发布于2025-01-12
  • 为什么非常量变量不能用作 C++ 中的模板参数?
    为什么非常量变量不能用作 C++ 中的模板参数?
    为什么非常量变量不能作为模板参数传递?在 C 中,模板参数必须是常量表达式。这意味着它们的值必须在编译时已知。编译器无法在此上下文中计算非常量变量。考虑代码:template <int a> void modify(){}要传递一个非常量变量作为模板参数,我们可以这样写:for(int ...
    编程 发布于2025-01-12
  • Go 的 context 包如何用于超时 Goroutine?
    Go 的 context 包如何用于超时 Goroutine?
    Go 如何处理超时 Goroutine?问题:您正在构建一个处理多个 HTTP 调用的工具在并发 goroutine 中。为了防止无限期执行的情况,您寻求一种在特定时间间隔后取消 goroutine 的方法。解决方案:同时创建 goroutine 休眠的方法在指定的持续时间内发送广播消息来取消其他 ...
    编程 发布于2025-01-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3