字符串常见bug和解决方法
编程很多时候就是和字符串打交道,字符串也经常让人头疼。
字符串编码主要遇到两类问题,一类是编码导致的乱码问题,如果有中文,最好全部统一为UTF-8格式,同时注意区分UTF-8有BOM和无BOM的情况。二类问题是一些特殊字符导致的,是否需要转义,或者一些不可见字符导致的问题。
这篇博客中将陆续记录一些字符串问题和解决方法。
1. 不可见字符串bug
有时候字符串中包含一些特殊字符,这些字符往往是不可见字符,导致我们以为的字符串和实际字符串不一样,这样会我们的很多操作失败,比如匹配失败,或者保存结果和预期不符等等。
比如“\n”和“\r”在Linux和windows中有不同含义,两个系统之间倒换文件时经常导致bug。
\n是换行,英文new line
\r是回车,英文Carriage return
按照本来意思,应该是指机械打字机的回车和换行两个概念,作用分别是:换行就是把滚筒卷一格,不改变水平位置;回车就是把水平位置复位,不卷动滚筒。
即\n是去到下一行,相同竖直偏移位置,\r是去到当前行起始位置,则\r\n表示我们通常理解的回车意义。
但现在操作系统中,Unix内核的操作系统,一般以\n表示回车,Windows系统一般则以\r\n表示回车。所以windows下文本文件在linux中用vim打开时,每一行尾常有个^M字符。
有时候操作字符串,只替换了\n,没有处理\r时,会出现一些意外情况。这种时候在python中可以使用repr()函数逐字的打印字符串,查看是否含有特殊字符。
在python中,\n和\r同样都有换行的功能。不同的是光标的位置:\n在下一行开头,\r在本行的开头
print u"你好吗?\n朋友"
print u"——分隔线——"
print u"你好吗?\r朋友"
print u"——分隔线——"
my_str = """use your_db;\r\nselect * from your_db.table limit 1000;\r\nselect * from your_db.tab2 limit 1000;\r\n"""
print my_str
print repr(my_str)
print "\n\n"
my_str = my_str.replace('\n',' ')
print my_str
print repr(my_str)
Mysql或Hive中有时候也会出现特殊字符,导致控制台显示无法对齐,或者显示不全,或者出现一行变多行,一般也很可能是\r或者\n等特殊字符导致。
参考链接
1. \r,\n与\r\n有什么区别?
2. How a newline can ruin your Hive
3. How to find and fix invalid character data in MySQL
4. mysql select结果显示不全、错乱解决办法
5. Difference between __str__ and __repr__?
6. How to print a string literally in Python
7. Remove all line breaks from a long string of text