...
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Microsoft YaHei,22,&H00FFFFFF,&HF0000000,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,0,2,30,30,5,134
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:02.07,0:00:04.32,Default,NTP,0000,0000,0000,,《老友记》第二季第一集 罗斯的新女友
Dialogue: 0,0:00:49.08,0:00:52.36,Default,NTP,0000,0000,0000,,{\fn微软雅黑}{\fs14}{\b0}{\c&HFFFFFF&&}{\3c&000000&}{\4c&H000000&}Flight number 457 from Beijing now arriving.
Dialogue: 0,0:00:58.42,0:00:59.35,Default,NTP,0000,0000,0000,,{\fn微软雅黑}{\fs14}{\b0}{\c&HFFFFFF&&}{\3c&000000&}{\4c&H000000&}Oh, my God!
Dialogue: 0,0:01:00.44,0:01:01.32,Default,NTP,0000,0000,0000,,{\fn微软雅黑}{\fs14}{\b0}{\c&HFFFFFF&&}{\3c&000000&}{\4c&H000000&}Oh, my God!
Dialogue: 0,0:01:02.65,0:01:03.49,Default,NTP,0000,0000,0000,,{\fn微软雅黑}{\fs14}{\b0}{\c&HFFFFFF&&}{\3c&000000&}{\4c&H000000&}Excuse me.
Dialogue: 0,0:01:03.54,0:01:05.02,Default,NTP,0000,0000,0000,,{\fn微软雅黑}{\fs14}{\b0}{\c&HFFFFFF&&}{\3c&000000&}{\4c&H000000&}Move, move, move! Emergency, please!
Dialogue: 0,0:01:05.02,0:01:06.51,Default,NTP,0000,0000,0000,,{\fn微软雅黑}{\fs14}{\b0}{\c&HFFFFFF&&}{\3c&000000&}{\4c&H000000&}Excuse me, excuse me.
...
import org.apache.spark.sql.functions.input_file_name
object ChangEncoding {
def main(args:Array[String]):Unit = {
val spark = SparkSession
.builder()
.master("local")
.appName("ChangEncoding")
.getOrCreate()
import spark.implicits._
val ds = spark.read
.text(s"${Constants.HDFS}friends/ass/*S02E02.eng.ass")
.select(input_file_name, $"value")
.as[(String, String)]
val dialogueDs = ds.filter(x => x._2.startsWith("Dialogue"))
println(ds.collect().length) //694
println(dialogueDs.collect().length) //0
println(ds.first()._2)
ds.first()._2.foreach(println)
��[ S c r i p t I n f o ] //IDEA控制台,更不明显
�
�
[
S
c
r
i
p
t
I
n
f
o
]
码元与码点的区别,主要是码点是从人的角度,属于十进制的概念;而码元则是码点转换为二进制格式,并且加入了特定编码格式的位序列;
字库是一种特殊的字符集,此次可以认为是为了实现计算机编码,由现实世界的字符集中抽取的一部分字符形成的特定编码支持的字符集合;
可以将Unicode系统看作一种非常庞大的字符集,而UTF-8, UTF-16, UTF-32则是基于Unicode字符集形成的不同的编码; 对于其他标准,比如ASCII, GB18030等,可以认为他们既是字符集也是编码方式,因为他们只有一种编码方式;
台湾、香港和澳门地区主要使用Big5作为中文字符编码,其主要支持繁体中文。
EUC-CN为对应的EUC系列中文标准。
EUC-TW为对应的EUC系列台湾标准。
GB2312是使用双字节的中文编码,并且两个字节都大于127.第一个字节叫做高字节,从0xA1到0xF7, 第二个字节叫做低字节,从0xA1到0xFE,共包括7000多的简体中文、数学符号、罗马希腊字母、日文假名等。原来在ASCII里的数字、标点、字母也编了两个字节长的编码,及“全角”字符,而原来的ASCII中的则为“半角”。
GBK是在GB2312基础上,取消了低字节是127以上的限制,只保留高字节为大于127,其包括了所以GB2312的内容,同时又增加了近20000个新的中文,包括繁体和一些符号。
GB18030是在GBK基础上,增加了数千个少数民族文字形成的。
GB2312,GBK,GB18030统称为DBCS(Double Byte Charecter Set 即双字节字符集),在这些编码中,一个中文字符的字符长度为2(在Unicode系统中,一个中文字符的字符长度为1)。
Unicode常用的编码方式有UTF-8, UTF-16, UTF-32, UTF即Unicode transformation format.
Number of bytes |
Bits for code point |
First code point |
Last code point |
Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|---|---|---|
1 | 7 | U+0000 | U+007F | 0xxxxxxx |
|||
2 | 11 | U+0080 | U+07FF | 110xxxxx |
10xxxxxx |
||
3 | 16 | U+0800 | U+FFFF | 1110xxxx |
10xxxxxx |
10xxxxxx |
|
4 | 21 | U+10000 | U+10FFFF | 11110xxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
UTF-16根据双字节中两个字节的位置不同,而细分成UTF-16BE(big-endian)和UTF-16LE(little-endian),UTF-16(如有BOM,根据BOM确定,否则默认大端, Windows系统默认小端), 同样,UCS-2也分UCS-2BE和UCS-2LE。
在超过一个字节存储在计算机中时,将最重要的字节(most significant byte即MSB)存储在前或者后的不同,分别叫做大端(big-endian)和小端(little-endian)。在数据交换时,因为发送方和接受方可能使用不同的显示顺序,可能会导致显示错误,针对这种情况,UTF-16使用BOM(Byte Order Mark,即0xFEFF/0xFFFE,0宽度,非字符,置于实际数据流前,0xFEFF表示大端, 0xFFFE表示小端)来告知接收方数据是否需要进行转制。
如果一个UTF-16编码的文本本身,没有携带BOM, RFC 2781协议规定应默认为大端,但在Windows系统中则默认为小端。
由于UTF-8为面向字节的编码,并没有这种问题(还有待理解,对于UTF-8中多字节的和UTF-16有什么区别),但是尽管如此,有时也可能有一个初始化的BOM(EF BB BF)表示数据流为UTF-8编码的数据。
如下表为UTF-16的转换事例(来自UTF-16 - Wikipedia):
Character | Binary code point | Binary UTF-16 | UTF-16 hex code units |
UTF-16BE hex bytes |
UTF-16LE hex bytes |
|
---|---|---|---|---|---|---|
$ | U+0024 |
0000 0000 0010 0100 |
0000 0000 0010 0100 |
0024 |
00 24 |
24 00 |
€ | U+20AC |
0010 0000 1010 1100 |
0010 0000 1010 1100 |
20AC |
20 AC |
AC 20 |
𐐷 | U+10437 |
0001 0000 0100 0011 0111 |
1101 1000 0000 0001 1101 1100 0011 0111 |
D801 DC37 |
D8 01 DC 37 |
01 D8 37 DC |
𤭢 | U+24B62 |
0010 0100 1011 0110 0010 |
1101 1000 0101 0010 1101 1111 0110 0010 |
D852 DF62 |
D8 52 DF 62 |
52 D8 62 DF |
与UTF-16类似,UTF-32也分成大端和小端,分别使用00 00 FE FF和FF FE 00 00作为BOM。
从编码的本质看,原文件属于UCS-2 LE BOM编码(Nodepad++), 而spark的读取文件使用的编码是UTF-8,所以导致显示错误。
那么从理论上说,将spark获取到的文本通过UTF-8编码进行解码为字节流后, 在使用UCS-2 LE应该可以实现,但是经测试,仍然不对。
关于在java中的相关实验,待完成;
关于在spark中最终解决该问题,待完成;