Spark生成CSV后BOM变EF BF BD

栏目: 编程工具 · 发布时间: 7年前

内容简介:工作中需要通过Spark以csv格式导出日志文件。实现功能不太复杂,但是在中文识别上遇到了些问题。解决csv文件中的乱码最直接的思路就是添加BOM,这样Excel在打开Excel的时候就知道使用什么样的编码来解析这篇文档了。先写了段测试代码验证了下:

工作中需要通过Spark以csv格式导出日志文件。实现功能不太复杂,但是在中文识别上遇到了些问题。

解决csv文件中的乱码最直接的思路就是添加BOM,这样Excel在打开Excel的时候就知道使用什么样的编码来解析这篇文档了。

先写了段测试代码验证了下:

  val bom = Array(0xEF, 0xBB, 0xBF).map(_.toByte)
  val result = ListBuffer(new String(bom) + "title\n")
  result += "en-chars\n"
  result += "中文字符"
  val w = new FileWriter("/my-file.csv")
  result.foreach(w.write)
  w.flush()

这段代码会生成一个包含中文字符的csv文件。添加的BOM提示了生成的文件使用的是UTF-8编码。经测试使用Excel打开该文件可以识别中文字符。

将相同的逻辑写到Spark程序中,结果却没有预期的那么美好:中文乱码依然存在,并且新添加的BOM也变成了乱码。BOM变成了这几个奇怪又熟悉的字符:

锟斤拷锟潔

最后面那个“潔”还吞了一个英文字符 e

在十六进制下查看BOM变成了这几个字符:

EF BF BD EF BF BD EF BF BD

也就是说BOM中的三个字符每个都被替换成了 EF BF BD

查了下资料,这三个字符的意义是这样的:

它是很多编程语言以及库中的备胎,即无效的码点值在编码的时候会默认用这个码点值进行替换,即utf-8中的超级「备胎」(REPLACEMENT CHARACTER)

也就是说Spark将我添加的BOM字符串视为了无效字符。

为什么会这样呢?一时陷入了无效的思索和尝试中。

说下最后的解决方案吧,巨简单:在使用BOM数组创建字符串的时候指明使用UTF8编码。就是像下面这样:

 val bom = Array(0xEF, 0xBB, 0xBF).map(_.toByte) //添加UTF BOM或者说UTF签名
 var result = ListBuffer(new String(bom, StandardCharsets.UTF_8) + title)

会出现这个问题估计是因为服务器的默认文件编码不是UTF-8导致的。


以上所述就是小编给大家介绍的《Spark生成CSV后BOM变EF BF BD》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员代码面试指南:IT名企算法与数据结构题目最优解

程序员代码面试指南:IT名企算法与数据结构题目最优解

左程云 / 电子工业出版社 / 2015-9 / 79.00元

这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联......一起来看看 《程序员代码面试指南:IT名企算法与数据结构题目最优解》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码