博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UTF-8编码的空格(194 160)问题
阅读量:6941 次
发布时间:2019-06-27

本文共 1175 字,大约阅读时间需要 3 分钟。

  前台的字符串传递到后台进行处理,发现了一个较诡异的问题:字符串中的一个空格(ASCII:32)被UTF-8编码之后变成了一个诡异的字符(ASCII:194 和 160的组合)!但在后台其表象还是空格。

  在UTF-8编码里面存在一个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候表现为一个半角空格,跟一般的半角空格(ASCII 0x20)不同的是它的宽度不会被压缩,所以排版中常能用到它。但是GB2312、Unicode之类并没有这样的字符,所以转换后前台会显示为“?”号,只是显示为问号而不是真正的问号,所以无法被替换!

  对这两个看似相同的字符串进行一下转换可以确认:原始的字符串为:”#'  %$ ()_ -{}.b“  被转义后的字符串为:”#'  %$ ()_ -{}.b“ 【注:双引号不算,转换为byte数组之后可以看到,原来的是16个字节,后来的那个是17个字节:这就是 32 --> 194  160 的结果】

string tmp1 = "#'  %$ ()_ -{}.b";            string tmp2 = "#'  %$ ()_ -{}.b";            byte[] o1 = Encoding.UTF8.GetBytes(tmp1);            byte[] o2 = Encoding.UTF8.GetBytes(tmp2);

  知道了这个原因之后,就好办了,写代码可以把194 和 160 的组合转换回去。程序(C#)如下所示:

private string ChangeUTF8Space(string targetStr)        {            try            {                string currentStr = string.Empty;                byte[] utf8Space = new byte[] { 0xc2, 0xa0 };                string tempSpace = Encoding.GetEncoding("UTF-8").GetString(utf8Space);                currentStr = targetStr.Replace(tempSpace, " ");                return currentStr;            }            catch (Exception ex)            {                return targetStr;            }        }

  更多的编码格式对照表可以看这篇文章: 

  

转载地址:http://xsinl.baihongyu.com/

你可能感兴趣的文章
使用摄像头或视频运行 ORB-SLAM2 SLAM14讲 第一次课后作业
查看>>
Nginx源码剖析之内存池,与内存管理
查看>>
优化网站设计系列文章总结和导读
查看>>
列数组Program perl 数据结构
查看>>
位域简介
查看>>
用CALayer实现聚光灯效果
查看>>
Atitit。sql2016标准化的规划方案 v3 q2a
查看>>
在Windows .NET平台下使用Memcached
查看>>
Webpack 入门指南 - 2.模块
查看>>
C++ STL中Map的按Key排序
查看>>
【转载】Redis的一些使用场景
查看>>
【转】CString与string、char*的区别和转换
查看>>
英语词汇(3)Call out to sb
查看>>
spring自己主动装配Bean属性
查看>>
面对苦难请勇敢
查看>>
安全加固总论
查看>>
消息中间件概述
查看>>
008_线上排障汇总
查看>>
HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性、非功能性、关键约束)-下篇...
查看>>
EF Core 2.1 中的 Eager loading、Explicit loading和LazyLoading (转自MSDN)
查看>>