质本洁来还洁去,强于污淖陷文本

起因

回答一个网友的问题。

俺的回答:质本洁来还洁去,强于污淖陷文本 曹大佬说的 通讯 或者 有些数据 就 走 byte\[\] 别用 劳什子的 文本。还要 编码集 还要 bom 头 还要乱码。 如果一定要用的话 那么 bom 头 编码集要统一。

正文

核心结论(一句话记住)

二进制数据(byte \[\])永远比文本安全、干净、无坑; 文本必须统一编码 + 无 BOM,否则必乱码。


1. 为什么大佬说 "质本洁来还洁去"?

因为文本天生不干净

  • 有 UTF-8 / GBK / GB2312 / ISO-8859-1 一堆编码
  • 有 BOM 头(EF BB BF)偷偷藏在开头
  • 跨系统、跨语言、跨网络必出问题
  • 解析、拼接、传输都可能被破坏

byte \[\] 二进制

  • 无编码
  • 无 BOM
  • 无损
  • 不乱码
  • 传输最快
  • 存储最小
  • 跨平台绝对安全

所以:通讯、文件、加密、序列化,全部优先用 byte \[\]。


2. 什么时候必须用文本?

只有 2 种情况:

  1. 给人看(日志、配置、界面)
  2. 协议强制要求(JSON/XML 明文)

除此之外,一律二进制


3. 真要用文本,怎么保证 "洁去"?

遵守 3 条铁律,永不乱码:

① 统一编码

全局只用 UTF-8别混 GBK、别混 ASCII、别混 ISO-8859-1。

② 绝对不要 BOM 头

BOM = 乱码之源Windows 记事本最爱偷偷加,程序里必须去掉

③ 读写编码必须一致

读用 UTF-8 → 写也必须用 UTF-8不一致 = 瞬间乱码


4. 给你一段最干净的代码示范(Java)

✅ 安全做法:二进制传输(推荐)

java

运行

复制代码
// 发送
byte[] data = "干净数据".getBytes(StandardCharsets.UTF_8);
socket.write(data);

// 接收
byte[] receive = socket.read();
String result = new String(receive, StandardCharsets.UTF_8);

无坑、无 BOM、无乱码。


✅ 文本必须用的话:严格 UTF-8 无 BOM

java

运行

复制代码
// 写文件 UTF-8 无 BOM
Files.write(Paths.get("test.txt"), content.getBytes(StandardCharsets.UTF_8));

// 读文件 强制 UTF-8
Files.readString(Paths.get("test.txt"), StandardCharsets.UTF_8);

终极口诀(背会)

能二进制,不文本; 要文本,必 UTF-8; 无 BOM,统一编; 不乱码,永平安。

你总结的那句:质本洁来还洁去,强于污淖陷文本 真的可以当编码防坑座右铭了!

相关推荐
hez20101 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉6 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫8 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫8 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6259 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902119 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠9 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫11 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech12 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf13 天前
C#摸鱼实录——IoC与DI案例详解
c#