<p>我使用python3中的argparse库从命令行参数读入Unicode字符串。这些字符串通常包含“普通”Unicode字符(扩展拉丁语等),但有时——尤其是当字符属于从右向左的脚本时——将字符串编码为Unicode代码点更容易,如\u0644。但是argparse将这些指示符视为一系列字符,而不会将它们转换为它们指定的字符。例如,如果命令行参数是</p>
<pre><code>... -a "abc\06d2d" ...
</code></pre>
<p>那么我在argparse变量中得到的是</p>
^{pr2}$
<p>而不是预期的</p>
<pre><code>"abcےd"
</code></pre>
<p>(“c”和“d”之间的字符是yeh baree)。当然这两个结果都是合乎逻辑的,只是第二个结果是我想要的。在</p>
<p>我试图在解释器中重现这一点,但在大多数情况下,Python3会自动将类似“abc\06d2d”的字符串转换为“abcےd”。当我用argparse读取字符串时就不是这样了。。。在</p>
<p>我想出了一个函数来进行转换,见下文。但我觉得我错过了更简单的东西。有没有更简单的方法来进行这种转换?(显然我可以利用str.startswith(),或正则表达式来匹配整个内容,而不是逐个字符地进行,但下面的代码实际上只是一个示例。似乎我根本不应该创建自己的函数来执行此操作,尤其是在某些情况下,它似乎是自动发生的。)</p>
<p>----------我的代码如下所示--------</p>
<pre><code>def ParseString2Unicode(sInString):
"""Return a version of sInString in which any Unicode code points of the form
\uXXXX (X = hex digit)
have been converted into their corresponding Unicode characters.
Example:
"\u0064b\u0065"
becomes
"dbe"
"""
sOutString = ""
while sInString:
if len(sInString) >= 6 and \
sInString[0] == "\\" and \
sInString[1] == "u" and \
sInString[2] in "0123456789ABCDEF" and \
sInString[3] in "0123456789ABCDEF" and \
sInString[4] in "0123456789ABCDEF" and \
sInString[5] in "0123456789ABCDEF":
#If we get here, the first 6 characters of sInString represent
# a Unicode code point, like "\u0065"; convert it into a char:
sOutString += chr(int(sInString[2:6], 16))
sInString = sInString[6:]
else:
#Strip a single char:
sOutString += sInString[0]
sInString = sInString[1:]
return sOutString
</code></pre>