Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么GBK编码的文件与UTF-8文本相比是相同的?

为什么GBK编码的文件与UTF-8文本相比是相同的?
EN

Stack Overflow用户
提问于 2022-07-19 18:32:41
回答 1查看 81关注 0票数 0

我使用InputStreamReader来读取GBK编码txt,我认为lineTxt也会被GBK编码,但是当我比较"WGS 84 / UTM区域44N“时,它们是相同的。

以下是代码:

1、s是UTF-8编码的字符串。

2、lineTxt是GBK编码的字符串(我不确定,但我知道"read“是GBK)

3我猜"lineTxt = bufferedReader.readLine()“如果编码,将触发转换,但不确定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try (InputStreamReader read = new InputStreamReader(new FileInputStream(file), ENCODING_GBK);
         BufferedReader bufferedReader = new BufferedReader(read)) {
        String lineTxt;
        while ((lineTxt = bufferedReader.readLine()) != null) {
            if (lineTxt.contains("WGS 84 / UTM zone 44N")) {
                String s = new String("输出坐标系:WGS 84 / UTM zone 44N".getBytes(), StandardCharsets.UTF_8);
                System.out.println(System.getProperty("file.encoding"));
                System.out.println(Arrays.toString(s.getBytes()));
                System.out.println(Arrays.toString(lineTxt.getBytes()));
            }
        }
    } catch (IOException e) {
        log.error("Read file failed");
        e.printStackTrace();
    }
EN

回答 1

Stack Overflow用户

发布于 2022-08-14 00:36:34

当读取文件并将行存储为字符串对象时,编码将转换为字符串的内部表示形式(UTF-16)。lineTxt.getBytes()在平台的默认编码中将UTF-16字符串转换为字节数组(这取决于在Windows上的系统区域设置。当你在另一个月台的时候,它将是UTF-8 )。

如果要将文件的内容获取为字节数组(获取GBK表示形式,并且不希望将内容转换为UTF-16),请按以下方式读取该文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    File file = new File("C:\\tmp\\fileGBK.txt");
    byte[] lineTxt = Files.readAllBytes(file.toPath());
    System.out.println(Arrays.toString(lineTxt));
} catch (IOException e) {
    e.printStackTrace();
}

您将得到GBK ([-54, -28, -77, -10, -41, ...)中字符串的表示形式。

如果要逐个读取文件中的行并获取行的GBK表示形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
File file = new File("C:\\tmp\\fileGBK.txt");
final Charset ENCODING_GBK = Charset.forName("GBK");
try (InputStreamReader read = new InputStreamReader(new FileInputStream(file), ENCODING_GBK);
        BufferedReader bufferedReader = new BufferedReader(read)) {
    String lineTxt;
    while ((lineTxt = bufferedReader.readLine()) != null) {
        if (lineTxt.contains("WGS 84 / UTM zone 44N")) {
            String s = new String("输出坐标系:WGS 84 / UTM zone 44N".getBytes(), StandardCharsets.UTF_8);
            System.out.println(System.getProperty("file.encoding"));
            System.out.println(Arrays.toString(s.getBytes()));
            System.out.println(Arrays.toString(lineTxt.getBytes(ENCODING_GBK)));
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73045377

复制
相关文章
gbk,utf-8,unicode编码转换
1、将字符串'024f'转化为unicode字符,先将字符转化为16进制整数 code = int('024f',base=16) print '%x'%code,'%04x'%code 输出结果:24f 024f,一般选择后者处理凑足偶数字节 转化unicode编码 unichr(code) 运行得到unicode编码 u'\u024f' uc = unichr(code) print uc, type(uc) 输出字符,类型,特别注意unicode类型,处理起来有点不同,两个字节算一个字符 ɏ,uni
用户1733462
2018/06/01
4.8K0
Python中GBK, UTF-8和Unicode的编码问题
编码问题,一直是使用python2时的一块心病。几乎所有的控制台输入输出、IO操作和HTTP操作都会涉及如下的编码问题:
bear_fish
2018/09/20
4.1K0
Python 有关 Unicode UTF-8 GBK 编码问题详解
Unicode 也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。对于世界上所有的语言文字在 unicode 中都可以查看到。
读懂原理
2022/07/01
1.7K0
Python 有关 Unicode UTF-8 GBK 编码问题详解
27.GBK与UTF-8
在内存中,字符串的本质是二进制码。只有需要与用户交互时,程序才会将二进制码通过特定的编码方式转换成用户可以识别的字符串。GBK与UTF-8就是两种常用的编码方式。其中,utf-8编码一个字母用一个字节表示,一个汉字用三个字节表示,gbk编码一个字母用一个字节表示,一个汉字用两个字节表示。 一段文字被读入内存,计算机会按照特定的编码方式比如utf-8将其转化为二进制码,当需要打印到屏幕上时,计算机再按照utf-8将二进制码还原成原来的那一段文字。 参考: https://mp.weixin.qq.com
用户4381798
2020/08/11
9450
unicode、utf-8、ansi、gbk、gb2312编码详解
在开始本文前,我需要大家思考一个问题:你知道联通为什么干不过移动吗? 我们来看看微软站在哪边吧,用记事本写下联通两个字:
tnt阿信
2020/08/05
7.5K0
unicode、utf-8、ansi、gbk、gb2312编码详解
C++读取UTF-8及GBK系列的文本方法及原理
首先了解UTF-8的编码方式,UTF-8采用可变长编码的方式,一个字符可占1字节-6字节,其中每个字符所占的字节数由字符开始的1的个数确定,具体的编码方式如下:
CPP开发前沿
2021/11/25
2.3K0
UNICODE,GBK,UTF-8
UNICODE,GBK,UTF-8     简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与gbk就是不一样的,假设uncode为a040,gbk为b030,而uft-8码,就是把那个值表现的形式.utf-8码完全只针对uncode来组织的,如果GBK要转UTF-8必须先转uncode码,再转utf-8就OK了. 详细的就见下面转的这篇文章. 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词 这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢? 我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢? 问题二: 最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么关系。 查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。 0、big endian和little endian big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode编码是6C49。那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。如果将49写在前面,就是little endian。 “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。 我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。 1、字符编码、内码,顺带介绍汉字编码 字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。 GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。 GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。 从ASCII、GB2312到GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK都属于双字节字符集 (DBCS)。 2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。 CJK就是中日韩的意思。Unicode为了节省码位,将中日韩三国语言中的文字统一编码。GB13000.1就是ISO/IEC 10646-1的中文版,相当于Unicode 1.1。 GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。例如:UCS的0x3400在GB18030中的编码应该是8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。 微软提供了GB18030的升级包,但这个升级包只是提供了一套支
lulianqi
2018/08/30
2.6K0
字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享。
JackJiang
2018/08/29
2.2K0
Unicode 与 UTF-8 编码的转换
Unicdoe【真正的完整码表】对照表(二)汉字Unicode表_hherima的博客-CSDN博客_unicode中文对照表注意:下面这两段是代理区。即第1——16平面的间接表示,四个字节的汉字就在这里表示D800-DBFF:High-half zone of UTF-16 DC00-DFFF:Low-half zone of UTF-16 本篇中包含了所有常用汉字27973个,剩余汉字使用代理区标识欢迎查看字符编码相关博客专栏比如:由iPhone emoji问题牵出的UTF-16编码,UTF-8编码探究
跟着飞哥学编程
2022/11/30
1.2K0
Unicode 与 UTF-8 编码的转换
Unicode,GBK和UTF-8
看到题目,你也许会说,“又是这种月经帖,这问题我早弄清楚了”. 但如果有人问你,“Unicode,GBK和UTF-8有什么区别?”, 你能自信地给他一句简短清晰的回答吗? 如果不能的话, 那还是看一下
evilpan
2023/02/12
1.6K0
Unicode,GBK和UTF-8
简述 ascii、unicode、utf-8、gbk 的关系
美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码。
用户7954744
2020/11/09
1.9K0
编码GBK的不可映射字符
1. 打开 File—setting—editor—code style—file encodings。 将几处encoding选择为UTF-8;
云深无际
2020/08/12
6.1K0
编码GBK的不可映射字符
Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
American Standard Code for Information Interchange。最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单。
JavaEdge
2020/05/26
2.6K0
字符编码技术专题(一):快速理解ASCII、Unicode、GBK和UTF-8
今天中午,我突然想搞清楚 Unicode 和 UTF-8 之间的关系,就开始查资料。
JackJiang
2023/09/27
2.6K0
字符编码技术专题(一):快速理解ASCII、Unicode、GBK和UTF-8
IDEA 工程文件 UTF-8 编码设置
?
一个会写诗的程序员
2019/04/18
2.6K0
IDEA 工程文件 UTF-8 编码设置
【java基础之字符问题】UTF-8和GBK的区别与联系
1 字符集 字符集就是编码的集合,例如unicode、GBK、GB2312等都属于字符集。
用户5640963
2019/07/26
1.5K0
UTF-8编码中BOM的检测与删除
所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space。 注:Unicode相关知识的详细介绍请参考UTF-8, UTF-16, UTF-32 & BOM。 对于UTF-8/16/32而言,它们名字中的8/16/32指的是编码单位是多少位的,也就是说,它们的编码单位分别是8/16/32位,换算成字节就是1/2/4字节,如果是多字节,就要牵扯到字节序,UTF-8以单字节为编码单位,所以不存在字节序。 UTF-8主要的优点是可以兼容ASCII,但如果使用BOM的话,这个好处就荡然无存了,除此以外,BOM的存在还可能引发一些问题,比如下面错误便都有可能是BOM导致的:
LA0WAN9
2021/12/14
2.6K0
【错误记录】IntelliJ IDEA 中编译运行报错 ( 当前设置 GBK 编码 | 错误: 编码UTF-8的不可映射字�? )
文章目录 一、 报错信息 二、 解决方案 一、 报错信息 ---- 当前的 IntelliJ IDEA 设置的编码为 GBK 编码 , 选择 " 菜单栏 / File / Settings " 选项 , 在 " File Encodings " 中 , 查看 工程的编码 , 运行时报错 : 在中文注释的位置 , 编码报错 ; D:\002_Project\003_Java_Work\Exsample\src\main\java\ArrowCanvas.java:17: 错误: 编码UTF-8的不可映
韩曙亮
2023/04/01
5.2K0
【错误记录】IntelliJ IDEA 中编译运行报错 ( 当前设置 GBK 编码 | 错误: 编码UTF-8的不可映射字�? )
PHP判断变量内容是什么编码(gbk?utf-8) mb_detect_encoding
function convToUtf8($str) { if( mb_detect_encoding($str,"UTF-8, ISO-8859-1, GBK")!="UTF-8" ) {//判断是否不是UTF-8编码,如果不是UTF-8编码,则转换为UTF-8编码 return iconv("gbk","utf-8",$str); } else { return $str; } }
用户7657330
2020/08/14
1.1K0
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
例如其中字母a的二进制位:1100 001 = 97,那么a在计算机中就可以用1100001来保存。
mingjie
2023/04/27
1.6K0
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)

相似问题

汉字编码(UTF-8、GBK)

14

UTF-8编码文本的UTF-8编码与原始UTF-8编码文本不同

10

如何在Perl中实现gbk编码到utf-8编码的转换

33

chrome-devtools被弄错了!我的文件编码是GBK

15

如何使用GBK编码将汉字写入文本文件?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文