字符集与编码

共 53 题
#

1. Charset 在文件读写(Files.newBufferedReader)中显式指定与默认编码的工程价值

A 默认编码永远一致,无需指定
B 显式指定 Charset 会降低性能
C 显式指定编码与乱码无关
D 显式指定 Charset 保证编码一致与可移植,避免默认编码变化导致乱码 ✓ 正确答案
#

2. GB18030 字符集与 UTF-8 在 Spring Boot 4.0 国际化场景下混用时编码探测的精度如何保障

A GB18030 与 UTF-8 总能可靠区分
B 探测精度无条件保证
C 混用不影响编码
D 混用时字节探测有歧义,需通过统一编码、BOM、Content-Type 标记保障精度 ✓ 正确答案
#

3. NIO Charset 在 Linux LANG=C 环境下与 JVM file.encoding 的协商顺序是什么

A JDK 18+ 默认编码仍依赖 LANG
B LANG=C 会强制 file.encoding 为其他编码
C 显式 -Dfile.encoding 最优,JDK 18+ 默认 UTF-8 不受 LANG=C 影响,LANG 只是旧版推断来源 ✓ 正确答案
D 协商顺序不可控
#

4. sun.nio.cs 包的扩展字符集实现

A sun.nio.cs 是公开 API
B sun.nio.cs 是 JDK 内部字符集实现包,提供 GBK/UTF-8 等主流编码,应通过 Charset.forName 使用 ✓ 正确答案
C sun.nio.cs 只提供 UTF-8
D 不应通过 Charset.forName 使用其字符集
#

5. 文件读写编码一致性(Files.newBufferedReader(path, charset))

A 读写需用同一编码,显式指定 charset 保证一致性,避免乱码 ✓ 正确答案
B 无需指定编码
C 读写编码不一致也不会乱码
D 编码一致性只影响性能
#

6. CSV 文件的分隔符、引号、换行与字符集是独立维度,导入前应怎样检测而不误判内容

A CSV 只需按逗号切分即可
B 字符集不影响 CSV 解析
C 引号内的逗号可直接切分
D 分隔符/引号/换行/字符集独立,需先确认字符集再按引号转义规则解析,避免误判内容 ✓ 正确答案
#

7. Charset 与 CharsetProvider 的 SPI 扩展

A CharsetProvider 不是 SPI
B 自定义字符集只能修改 JDK 源码
C CharsetProvider 是 SPI 接口,通过 ServiceLoader 注册自定义字符集,需实现 Charset 与编码/解码器 ✓ 正确答案
D 自定义字符集无需提供编码器
#

8. CharsetDecoder 的 decode、flush 与 reset 调用顺序是什么,输入结束标记错误会丢失哪些字符

A 只需调用一次 decode 即可
B 未标记结束不会丢失字符
C flush 应在 decode 之前
D decode 循环后再 flush 处理尾随字节,未标记 endOfInput 或未 flush 会丢失多字节序列的字符 ✓ 正确答案
#

9. CharsetEncoder 的 malformedInput 与 unmappableCharacter 处理

A 编码错误无法处理
B 默认策略是 IGNORE
C malformedInput 与 unmappableCharacter 两类错误可通过 REPORT/REPLACE/IGNORE 策略处理,默认 REPORT ✓ 正确答案
D unmappableCharacter 与 malformedInput 相同
#

10. CharsetEncoder/CharsetDecoder 在编码异常下的处理

A 异常会被静默忽略
B 异常默认抛异常(REPORT)保证数据安全,可调整策略,关键数据避免 IGNORE 静默丢数据 ✓ 正确答案
C IGNORE 最安全
D 编码异常无策略可选
#

11. DataInputStream 的 readUTF 变长编码与网络协议中长度前缀协议的配合

A readUTF 读取 2 字节长度前缀 + 变长 UTF-8 数据,与网络长度前缀分帧思想一致 ✓ 正确答案
B readUTF 无长度前缀
C readUTF 使用固定长度编码
D 长度前缀协议无法解决粘包
#

12. Emoji 表情字符(4 字节 UTF-8)在 String.length() 与 codePointCount 上的偏差如何影响业务截取

A length() 与 codePointCount 对 Emoji 相同
B 按 length() 截取不会切断 Emoji
C Emoji 用代理对/多码点,length() 与 codePointCount 偏差,截取需按码点或字素簇避免切断 ✓ 正确答案
D Emoji 只占一个 char
#

13. GBK/GB2312/GB18030 的中文编码边界

A GB2312 覆盖常用汉字、GBK 扩展、GB18030 变长覆盖全部 Unicode,三者向后兼容 ✓ 正确答案
B 三者互不兼容
C GB18030 覆盖范围最小
D GB2312 覆盖全部 Unicode
#

14. GBK/UTF-8/ISO-8859-1 在中文文本处理中的乱码根因与 Charset.forName 解析

A 乱码根因是读写编码不一致,ISO-8859-1 单字节不含中文,Charset.forName 按名称/别名解析 ✓ 正确答案
B ISO-8859-1 支持中文
C Charset.forName 找不到字符集不抛异常
D 乱码与编码无关
#

15. InputStream/OutputStream 与 Reader/Writer 的分工与 InputStreamReader 桥接的字符集转换

A Reader 处理二进制
B InputStreamReader 不涉及字符集
C 字节流处理二进制、字符流处理文本,InputStreamReader 按指定字符集将字节解码为字符 ✓ 正确答案
D 字节流与字符流无区别
#

16. JDK 25 中 Charset.forName 与 StandardCharsets 的查找性能差异主要来自哪段缓存逻辑

A forName 比 StandardCharsets 更快
B StandardCharsets 是直接引用无查找,forName 需按名称缓存查找,前者性能更高 ✓ 正确答案
C 两者性能完全相同
D forName 无缓存
#

17. JSON 传输通常采用 UTF-8,但响应头与实际字节不一致时,客户端应信任哪一层并如何告警

A 永远信任实际字节
B 优先信任响应头 charset,解码失败时回退字节检测并告警,服务端应保证一致性 ✓ 正确答案
C 响应头 charset 无意义
D 不一致时无需处理
#

18. 如何复用 CharsetEncoder/CharsetDecoder 避免每次 getBytes/new String 的分配开销,线程安全如何保证

A Encoder/Decoder 是线程安全的,可全局共享
B 复用无收益
C Encoder/Decoder 有状态非线程安全,复用需 ThreadLocal 或池化隔离,并 reset 复位 ✓ 正确答案
D ThreadLocal 会导致线程安全问题
#

19. Java 字符串(UTF-16)与字节流的相互转换

A String 内部是字节数组
B 转换无需指定编码
C 编码与解码用不同字符集也正确
D getBytes 编码、new String 解码,需指定同一 Charset 才能正确还原 ✓ 正确答案
#

20. Java 的 UTF-16 内部字符存储与 Unicode 17(最新标准)

A Java 只能表示 BMP 字符
B 补充平面字符占一个 char
C Java 用 UTF-16 存储,BMP 单 char、补充平面用代理对,可表示 Unicode 17 全部码点 ✓ 正确答案
D Unicode 17 与 Java 存储无关
#

21. Java 默认字符集自 JDK 18 统一为 UTF-8 后,旧系统迁移仍需检查哪些文件和启动参数

A 迁移后无需任何检查
B 默认编码重启后自动兼容旧数据
C 需检查隐式依赖默认编码的代码(getBytes 无参等)、启动参数与旧文件编码,显式指定 Charset ✓ 正确答案
D 只检查启动参数即可
#

22. MIME charset 头与 Content-Type 在 HTTP/2 场景下的字符集协商机制差异是什么

A HTTP/2 有独立的字符集协商机制
B HTTP/2 不关心 charset
C Content-Type 与字符集无关
D 字符集协商靠 Content-Type 的 charset 参数,HTTP/2 的差异主要在传输层而非字符集语义 ✓ 正确答案
#

23. PrintStream(System.out)的自动刷新与字符集编码在重定向日志时的陷阱

A 重定向日志无编码问题
B PrintStream 总是自动刷新
C 陷阱包括缓冲不自动刷新、默认编码乱码、吞异常,重定向时需显式编码与及时 flush ✓ 正确答案
D PrintStream 会抛出编码异常
#

24. Properties.load(InputStream) 与 load(Reader) 的编码语义有何差异,现代配置应如何避免转义依赖

A load(InputStream) 默认 ISO-8859-1 需转义,load(Reader) 可指定编码,现代配置用 UTF-8/XML/YAML 避免转义 ✓ 正确答案
B 两种 load 编码完全相同
C load(InputStream) 默认 UTF-8
D Properties 无需考虑编码
#

25. REPORT、REPLACE 与 IGNORE 三种编码错误策略各有什么数据风险,服务端默认应如何选择

A IGNORE 最安全
B REPLACE 不会篡改数据
C 服务端默认应选 IGNORE
D REPORT 最安全、REPLACE 篡改数据、IGNORE 静默丢数据,服务端默认应选 REPORT ✓ 正确答案
#

26. StandardCharsets 在 JDK 17 的新增

A StandardCharsets 只提供 UTF_8
B StandardCharsets 提供 UTF_8/UTF_16/ISO_8859_1 等常用字符集常量(自 JDK 7 起即包含 UTF_16 系列,JDK 17 未新增) ✓ 正确答案
C StandardCharsets 是运行时枚举
D StandardCharsets 不提供 ISO_8859_1
#

27. StandardCharsets.UTF_8 与 Charset.forName 的差异

A 两者性能完全相同
B StandardCharsets.UTF_8 是直接引用快且无异常,forName 运行时查找可能抛异常,推荐前者 ✓ 正确答案
C forName 不会抛异常
D StandardCharsets 返回不同实例
#

28. String.length、codePointCount 与 UTF-8 字节数为何不同,数据库字段限长应按哪种单位校验

A length 是 UTF-16 char 数、codePointCount 是码点数、字节数是 UTF-8 长度,字段限长应按数据库实际存储单位校验 ✓ 正确答案
B 三者恒等
C 直接按 length 校验即可
D 字节数与字符数无关
#

29. URL 编码(URLEncoder/URLDecoder)

A URLEncoder 空格编为 %20
B URLEncoder 是表单编码(空格为 +),与 URL 路径编码(%20)不同,需指定字符集 ✓ 正确答案
C URLEncoder 与路径编码相同
D URLEncoder 无需指定字符集
#

30. UTF-8 BOM 在文本文件中可选但在协议字段中可能成为内容,读取时应如何明确处理

A BOM 在所有场景都被忽略
B 协议字段中的 BOM 无影响
C BOM 在文件可选、在协议字段成为内容,读取时检测并跳过以保正确 ✓ 正确答案
D 文件读取总自动跳过 BOM
#

31. UTF-8 的过长编码、孤立续字节和代理码点为什么属于非法输入,安全校验应在哪层完成

A 代理码点可合法编码为 UTF-8
B 这些序列都是合法的
C 过长编码/孤立续字节/代理码点属非法 UTF-8,安全校验应在输入边界用严格解码器完成 ✓ 正确答案
D 校验应在业务逻辑内部完成
#

32. UTF-8/UTF-16/UTF-32 的差异与 BOM

A 三者都是定长编码
B UTF-8 变长兼容 ASCII 无字节序,UTF-16/32 有字节序问题需 BOM 标识 ✓ 正确答案
C UTF-8 有字节序问题
D BOM 只用于 UTF-32
#

33. Unicode NFC 与 NFKC 的规范化目标有何差异,用户名或签名输入为何不能随意选择兼容分解

A NFC 做规范分解组合保留语义,NFKC 做兼容分解可能改变语义,用户名应优先 NFC 避免破坏特殊字符 ✓ 正确答案
B NFKC 保留所有字符语义
C NFC 与 NFKC 完全相同
D 用户名应使用 NFKD
#

34. Unicode Normalization(Normalizer.normalize)在跨语言文本比较与排序中的工程价值

A 规范化与比较无关
B 排序只需看码点
C 规范化会破坏比较
D 规范化统一等价文本(如 é 的多种表示),保证跨语言比较与排序一致 ✓ 正确答案
#

35. Unicode 码点、UTF-16 code unit 与用户感知字素簇有何区别,字符串截断应以哪一层为准

A 字素簇是最小用户感知单元,截断应以字素簇为准,避免切断代理对或组合字符 ✓ 正确答案
B 截断按 code unit 即可
C 码点与字素簇相同
D 截断只看码点即可
#

36. charset 读取失败应回退到 UTF-8 还是 ISO-8859-1

A 应总是回退 ISO-8859-1
B 无需回退
C 回退 UTF-8 会掩盖问题
D 回退 UTF-8 严格可校验优先,ISO-8859-1 永不失败但掩盖问题,应避免盲目回退并告警 ✓ 正确答案
#

37. 字符串字面量在 class 文件常量池中 UTF-8 编码后被 javac 改写为 Latin-1 紧凑存储的判定边界

A 判定边界是字符数是否超过 255
B 常量池统一用 Modified UTF-8 存储;运行时紧凑字符串按字符码点 ≤ 0xFF 判定,用 Latin-1 紧凑布局,否则用 UTF-16 布局 ✓ 正确答案
C 所有字符串都用 UTF-16 存储
D 判定边界与码点无关
#

38. 字符集(Charset)与编码器(CharsetEncoder)

A Charset 是字符集规则,提供 newEncoder/newDecoder 获取有状态的编码/解码执行器 ✓ 正确答案
B CharsetEncoder 是字符集规则
C 两者无关联
D Charset 就是编码器
#

39. 按字节截断 UTF-8 日志或消息可能切断多字节序列,如何在容量限制下保持文本有效

A 字节截断总是安全的
B 字节截断可能切断多字节序列,需回退到完整字符边界或按字符截断 ✓ 正确答案
C UTF-8 是单字节编码
D 截断无需考虑字符完整性
#

40. 数据库连接、表、列和会话字符集不一致时,乱码与不可映射错误应如何沿链路定位

A 只需检查数据库实例
B 不一致不影响数据
C 字符集在数据库层自动统一
D 需沿应用编码、连接参数、表/列字符集、数据库实例逐层检查,统一为 UTF-8/utf8mb4 ✓ 正确答案
#

41. 紧凑字符串在内部选择 LATIN1 或 UTF16 对外部编码有何影响,业务代码为何不应依赖其布局

A 外部编码由内部布局决定
B 业务应依赖内部布局优化
C 内部 LATIN1/UTF16 布局是 JVM 优化,影响内存与 intrinsic,外部编码由其决定,业务不应依赖内部布局 ✓ 正确答案
D 紧凑字符串没有内部布局
#

42. 网络 I/O 的字符集约定

A 网络 I/O 通过协议层声明字符集(如 Content-Type charset),收发一致并统一 UTF-8 ✓ 正确答案
B 默认编码即可,无需声明
C 乱码与字符集约定无关
D 网络 I/O 无需约定字符集
#

43. 跨语言排序与比较为何不能只看 Unicode 码点,Collator 的强度和规范化应怎样配置

A 码点排序不具语言感知,应用 Collator 并按需求配置强度(PRIMARY/SECONDARY 等)与规范化 ✓ 正确答案
B String.compareTo 的码点排序适合所有语言
C Collator 与 Locale 无关
D 排序无需规范化
#

44. CharsetEncoder 的 replacement 与 unmappableCharacterAction 在 JDK 25 虚拟线程下的内存序如何保证

A 虚拟线程自动保证编码器线程安全
B 编码器可无同步共享
C CharsetEncoder 非线程安全,虚拟线程下共享需同步或 ThreadLocal 隔离,内存序由锁/volatile 保证 ✓ 正确答案
D 内存序与编码器无关
#

45. 无 BOM 文本的编码自动检测方法(启发式统计/ICU CharsetDetector)及其误判风险

A 无 BOM 检测总是准确
B ICU 检测无误判
C 只需按 ASCII 检测
D 检测用启发式统计/ICU CharsetDetector,非确定有误判风险,需结合业务约定与校验 ✓ 正确答案
#

46. JDK 25 中 Properties 配置文件默认 ISO-8859-1 与 loadFromXML 的 UTF-8 编码边界

A .properties 默认 ISO-8859-1 需转义,loadFromXML 用 UTF-8 可直接写中文 ✓ 正确答案
B loadFromXML 用 ISO-8859-1
C 两者编码相同
D .properties 默认 UTF-8
#

47. 紧凑字符串(JEP 254)与 JDK 25 对 String.getBytes(UTF_8) 的 intrinsic 优化

A 紧凑字符串只影响内存不影响编码
B intrinsic 优化与存储布局无关
C getBytes 无 intrinsic 优化
D 紧凑字符串简化 Latin-1 编码,getBytes(UTF_8) intrinsic 用 SIMD 加速,共同提升吞吐 ✓ 正确答案
#

48. java.util.Base64 的模块归属与 Native Image 体积优化边界

A Base64 在第三方模块
B Native Image 不含 Base64
C Base64 位于 java.base,Native Image 默认纳入标准库实现,体积优化受限于标准库包含 ✓ 正确答案
D Base64 无法在 Native Image 使用
#

49. JDK 25 引入的 JEP 484 Class-File API 在解析 class 文件常量池字符串时是否仍使用 Modified UTF-8

A JEP 484 改用标准 UTF-8
B 常量池不用 Modified UTF-8
C class 常量池字符串用 Modified UTF-8,JEP 484 API 读取时仍按此编码但对外暴露 String ✓ 正确答案
D JEP 484 不解析常量池
#

50. JEP 400 与 UTF-8 默认文件编码的关系在 JDK 25 中是否已正式落地

A JEP 400 尚未落地
B 默认编码仍依赖 LANG
C JDK 25 默认编码非 UTF-8
D JEP 400 在 JDK 18 落地,JDK 25 默认 file.encoding 为 UTF-8,除非显式覆盖 ✓ 正确答案
#

51. JFR 中与字符集相关的事件(如 jdk.Charset 事件)

A JFR 无字符集事件
B jdk.Charset 事件记录字符集转换信息,可用于分析编码/解码性能瓶颈 ✓ 正确答案
C jdk.Charset 事件与编码无关
D JFR 只能分析内存
#

52. UTF-8 编码 intrinsic 优化(JDK 25)对大字符串编码吞吐的影响

A intrinsic 只影响小字符串
B SIMD 降低编码吞吐
C 无 intrinsic 优化
D intrinsic 用 SIMD 向量化批量编码,显著提升大字符串吞吐,小字符串收益有限 ✓ 正确答案
#

53. Base64 的 URL-safe 与 MIME 变体在 JWT 与邮件场景的差异

A 三种变体完全相同
B JWT 用 basic 变体
C MIME 变体不加换行
D JWT 用 URL-safe(- _ 无 padding),邮件用 MIME(76 字符换行),字符/填充/换行有差异 ✓ 正确答案