如何移除XML文件的UTF-8 BOM头并正确将字节数组转为字符串
移除UTF-8 BOM头的两种简便实现方案
UTF-8的BOM为固定的前3个字节0xEF、0xBB、0xBF,你可以根据场景选择以下任意一种方案处理:
方案1:手动判断BOM字节后截取
适合不想额外创建流对象的轻量场景,直接判断字节数组开头是否匹配BOM特征,匹配则跳过前3位再转字符串:
byte[] xmlfile = ((Byte[])myReader["xmlSQL"]); byte[] utf8Bom = new byte[] { 0xEF, 0xBB, 0xBF }; bool hasBom = xmlfile.Length >= 3 && xmlfile[0] == utf8Bom[0] && xmlfile[1] == utf8Bom[1] && xmlfile[2] == utf8Bom[2]; string xmlstring = hasBom ? Encoding.UTF8.GetString(xmlfile, 3, xmlfile.Length - 3) : Encoding.UTF8.GetString(xmlfile);
方案2:利用StreamReader自动检测BOM(更推荐)
.NET内置的StreamReader默认支持自动识别各类编码的字节顺序标记,开启检测参数后会自动跳过对应BOM,无需手动硬编码判断,兼容性更强:
byte[] xmlfile = ((Byte[])myReader["xmlSQL"]); string xmlstring; using (var ms = new MemoryStream(xmlfile)) // 第三个参数设为true即开启BOM自动检测 using (var reader = new StreamReader(ms, Encoding.UTF8, detectEncodingFromByteOrderMarks: true)) { xmlstring = reader.ReadToEnd(); }
注意事项
- 不要直接使用
Encoding.UTF8.GetString()转换带BOM的字节数组,该方法不会自动剔除BOM,会在字符串开头生成隐形的零宽度字符,导致后续XML解析时出现找不到根节点等异常。
内容的提问来源于stack exchange,提问作者Beefybanana
相关产品推荐
相关产品推荐

