编程杂谈——Non-breaking space
近日,意外地遇上件不寻常的事情。在解析PDF文件,读取其中内容的时候,对某一文件的处理,始终无法达到预期的效果。
解析方法如下:
public void Parse(string value)
{
if (value == "General Information")
{
...
}
}
经调试发现此时传入的参数值是General Information,但在实际执行时并未进入到if (value == "General Information")条件语句内。这是件怪事。
将条件值与传入值分别拷贝出来,再放到一段简单的测试代码中,会看到结果显示为False。说明这两个真的不是等同的值。
class Program
{
static void Main(string[] args)
{
var a = "General Information";
var b = "General Information";
var eq = a == b;
Console.WriteLine(eq);
}
}
认真检查了一遍拼写,发现无误后,将字符串转成十六进制再调查。
General Information转换为以下结果:
47 65 6E 65 72 61 6C 20 49 6E 66 6F 72 6D 61 74 69 6F 6E
而General Information的结果是这样的:
47 65 6E 65 72 61 6C C2 A0 49 6E 66 6F 72 6D 61 74 69 6F 6E
可以看到两者的差异在于20与C2 A0。
由Ascii表可知,20正是表示空格。
C2 A0则代表Non-breaking space,是在UTF-8编码下的一种特殊的空格,意指换行时阻止空格两端文字被断开。
举个简单的例子,文字100 km如果出现在行末,当需要换行处理时,很可能会自动将100留在当前行末,而km被移到下一行首。但如果其中间的空格是Non-breaking space,那这种情况便不会发生了。
在Windows系统上,通过使用Alt+0160或者Alt+255(数字键都是小键盘上的)方式能够输入此类型的空格。但细想下,极少有可能是人为主动使用这种方式进行输入数据的。
再搜寻了下,原来在Finnish multilingual keyboard(芬兰语多语言键盘)上,可以通过AltGr + Space组合键方便地进行输入Non-breaking space,所以大约那份PDF文档的出处源自芬兰吧。

顺便提一句,即使在Visual Studio中开启了显示空格选项,这两种空格在编辑器中也是看不出区别的。

编程杂谈——Non-breaking space的更多相关文章
- 编程杂谈——std::vector与List<T>的性能比较
昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...
- Linux环境下网络编程杂谈《转》
今天我们说说“Pre-网络编程”.内容比较杂,但都是在做网络应用程序开发过程中经常要遇到的问题. 一.大端.小端和网络字节序 小端字节序:little-endian,将低字节存放在内存的起始地址: 大 ...
- TCP网络编程杂谈
作为一名IT工程师,网络通信编程相信都会接触到,比如Web开发的HTTP库,Java中的Netty,或者C/C++中的Libevent,Libev等第三方通信库,甚至是直接使用Socket API,但 ...
- 网络编程杂谈之TCP协议
TCP协议属于网络分层中的传输层,传输层作用的就是建立端口与端口的通信,而其下一层网络层的主要作用是建立"主机到主机"的通信,所以在我们日常进行网络编程时只要确定主机和端口,就能实 ...
- Swift 编程杂谈
1.Swift 3.0 使用Cocopods 导入第三方报错 之前一直用Object-C 编写代码 用Cocopods导入第三方没出过什么问题(PS:2017最新cocoaPods安装教程) 今天用 ...
- 编程杂谈——Platform target x64
在Visual Studio中选择.NET Framework框架并选用任意模板创建一个普通的Web应用工程,毫无疑问,此时应该是能够正常运行此工程的. 但是将工程属性->编译->Plat ...
- 编程杂谈——使用emplace_back取代push_back
近日在YouTube视频上看到关于vector中emplace_back与push_back区别的介绍,深感自己在现代C++中还是有不少遗漏的知识点,遂写了段代码,尝试比较两者的差别. 示例代码 #i ...
- Frontend Development
原文链接: https://github.com/dypsilon/frontend-dev-bookmarks Frontend Development Looking for something ...
- 中文里带半角空格导致的Text换行问题[Unity]
0x01 问题 最近策划反映了个问题,游戏里的多行文本会出现提前换行的问题,如下图所示: 文本错误地提前换行,导致第一行文本后面有大块空白区域 通过观察可以发现,当字符串中带有半角空格,且半角空格后面 ...
随机推荐
- mpvue开发微信小程序
前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...
- 与某公司CTO的一次闲聊
这是一次与某公司CTO的交流沟通,收获不少,记录下分享给大家,其中个别词句有自己增改成分. 既然是领导,就要学会画饼,画图的都是底下干活的. 管理好别人的预期,并能兑现承诺,不能只靠画大饼忽悠.针对某 ...
- CSS Grid网格布局全攻略
CSS Grid网格布局全攻略 所有奇技淫巧都只在方寸之间. 几乎从我们踏入前端开发这个领域开始,就不停地接触不同的布局技术.从常见的浮动到表格布局,再到如今大行其道的flex布局,css布局技术一直 ...
- c++小游戏——三国杀
#include<iostream> #include<time.h> #include<stdio.h> #include <stdlib.h> us ...
- Redis持久化背后的故事
Redis持久化 Redis提供了不同的持久化选项: RDB持久化以指定的时间间隔保存那个时间点的数据快照. AOF持久化方法则会记录每一个服务器收到的写操作.在服务器启动时,这些记录的操作会逐条执行 ...
- c语言进阶13-线性表之顺序表
一. ACM算法:顺序表的查找 顺序表的查找指获取顺序表的第i个元素.对于线性表的顺序存储结构来说,如果我们要实现获取元素的操作(GetElem),即将线性表L中的第i个位置元素值返回.就程序而言,只 ...
- 以for循环的方式了解var与let的区别
var是ES5定义变量的一种声明方式. let是ES6定义变量的一种声明方式---可定义局部变量,即定义块级作用域. 以下列简单的函数进行表现二者作用域的不同 在ES6之前,我们都是用var来声明变量 ...
- C语言中的“>>”和“
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是00 ...
- Docker volume speed up npm install
上一节决定在Jenkins中采用Docker作为构建环境,于是就可以为所欲为的使用各种node版本编译我们的项目.解决了版本切换问题.然而,Docker设计的目的就是纯净的执行环境,因此每次运行doc ...
- Linux学习(一)--VMware下Linux安装和配置
本片随便将给大家讲述linux在VM虚拟机上安装及终端的安装和配置 一.Linux介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线 ...