故事背景
系统配置
操作系统信息
1 | cat /proc/version |
Tensorflow Serving版本
1 | tensorflow_model_server -version |
1.1.2 系统语言编码信息
1 | locale |
故事描述
为了方便tensorflow serving的部署,我将tensorflow serving的配置信息以超级笔记模式下「代码块」暂时存在了Mac版印象笔记(Evernote)中,当我从笔记中直接复制内容并通过vim粘贴到tensorflow serving配置文件中时,tensorflow serving启动时报了如下错误提示
1 | [libprotobuf ERROR external/protobuf_archive/src/google/protobuf/text_format.cc:312] Error parsing text-format tensorflow.serving.ModelServerConfig: 13:1: Interpreting non ascii codepoint 194. |
然而,当我用vim打开文件时,看到的却是很正常的样子
可以看到,其与正常格式的文件用vim打开显示无异
发现原因和解决过程
原因探索
于是我尝试了删除刚刚新加的内容并重新尝试复制粘贴,仍然失败,然而当我尝试将空格部分全部删掉时,奇迹出现了,配置文件读取成功,于是我猜测是可能是不可见字符导致的,
有些不可见字符在系统中是没法直接看到的,之前就遇到过复制MySQL命令,语法绝对正确,但始终提示语法错误的问题,重新敲了一遍一样的命令却成功了的样子,那一次的不可见字符复制到vim中是可以看到的,但是这次vim中却没有提示,于是我尝试使用python3读取
1 | n [1]: aaa = '''config: { |
可以看到,直接从印象笔记类软件复制过来的命令,空格是用\xa0
来表示的
解决方法1
sublime是一个对格式很友好的文本编辑器,于是我将整体内容加入到sublime中,并复制不可见的空格,替换为手动输入的空格,再次复制到配置文件中,发现文件正常
解决方法2
我再次直接从vim中,用鼠标的方式复制含有不可见字符的语句,看到的结果也是正常的
1 | In [26]: aaa = '''config: { |
故事扩展
\xa0
的故事
查阅相关问题,根据python如何去掉字符串‘’,提供的信息
发现该字符是不间断空格符。我们通常所用的空格是
\x20
,是在标准ASCII可见字符 0x20~0x7e 范围内。而\xa0
属于 latin1 (ISO/IEC_8859-1)中的扩展字符集字符,代表空白符nbsp(non-breaking space)。 latin1 字符集向下兼容 ASCII ( 0x20~0x7e )。
类印象笔记的故事
再次尝试印象笔记工具,发现不只在「引用」的格式中会导致,普通格式也存在这个问题,但是只有让该笔记保存后,才会进行替换,猜测是因为转成了利于内置浏览器网页形式的格式,此问题可能不仅存在于印象笔记中,其它笔记模式或者网页复制可能也会导致这个问题