我怎样才能得到一个随机的unicode字符串
How can I get a random unicode string
我正在测试基于 REST 的服务,其中一个输入是文本字符串。所以我从我的 python 代码中向它发送随机 unicode 字符串。到目前为止,我发送的 unicode 字符串都在 ascii 范围内,所以一切正常。
现在我试图发送超出 ascii 范围的字符,但出现编码错误。这是我的代码。我已经经历了这个 link,但仍然无法理解它。
# coding=utf-8
import os, random, string
import json
junk_len = 512
junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len * 8))
for i in xrange(1,5):
if(len(junk) % 8 == 0):
print u'decoding to hex'
message = junk.decode("hex")
print 'Hex chars %s' %message
print u' '.join(message.encode("utf-8").strip())
第一行打印没有任何问题,但我无法在不对其进行编码的情况下将其发送到 REST 服务。因此,第二行我试图将其编码为 utf-8。这是失败并显示以下消息的代码行。
UnicodeDecodeError: 'ascii' codec can't decode byte 0x81 in position
7: ordinal not in range(128)
UTF-8 只允许某些位模式。您似乎在代码中使用了 UTF-8,因此您需要符合允许的 UTF-8 模式。
1 byte: 0b0xxxxxxx
2 byte: 0b110xxxxx 0b10xxxxxx
3 byte: 0b1110xxxx 0b10xxxxxx 0b10xxxxxx
4 byte: 0b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx
在多字节模式中,第一个字节表示整个模式中的字节数,前导 1 后跟 0 和数据位 x
。非前导字节都遵循相同的模式:0b10xxxxxx 具有两个前导指示位 10
和六个数据位 xxxxxx
.
一般来说,随机生成的字节不会遵循这些模式。您只能随机生成数据位x
。
正如其他人所说,生成有效的随机 UTF-8 字节非常困难,因为字节序列必须正确。
由于Unicode将所有字符都映射到0x0000到0x10FFFF之间的数字,因此需要做的就是随机生成该范围内的数字以获得有效的Unicode地址。将随机数传递给 unichar
(或 Py3 上的 char
),将 return 随机代码点字符的 Unicode 字符串。
然后您需要做的就是要求 Python 编码为 UTF-8 以创建有效的 UTF-8 序列。
因为,在完整的 Unicode 范围内有很多空白和不可打印的字符(由于字体限制),使用范围 0000-D7FF 和 Basic Multilingual Plane 中的 return 个字符,这将是更有可能由您的系统打印。当编码为 UTF-8 时,这会导致每个字符最多 3 个字节序列。
普通随机
import random
def random_unicode(length):
# Create a list of unicode characters within the range 0000-D7FF
random_unicodes = [unichr(random.randrange(0xD7FF)) for _ in xrange(0, length)]
return u"".join(random_unicodes)
my_random_unicode_str = random_unicode(length=512)
my_random_utf_8_str = my_random_unicode_str.encode('utf-8')
唯一随机
import random
def unique_random_unicode(length):
# create a list of unique randoms.
random_ints = random.sample(xrange(0xD7FF), length)
## convert ints into Unicode characters
# for each random int, generate a list of Unicode characters
random_unicodes = [unichr(x) for x in random_ints]
# join the list
return u"".join(random_unicodes)
my_random_unicode_str = unique_random_unicode(length=512)
my_random_utf_8_str = my_random_unicode_str.encode('utf-8')
我正在测试基于 REST 的服务,其中一个输入是文本字符串。所以我从我的 python 代码中向它发送随机 unicode 字符串。到目前为止,我发送的 unicode 字符串都在 ascii 范围内,所以一切正常。
现在我试图发送超出 ascii 范围的字符,但出现编码错误。这是我的代码。我已经经历了这个 link,但仍然无法理解它。
# coding=utf-8
import os, random, string
import json
junk_len = 512
junk = (("%%0%dX" % junk_len) % random.getrandbits(junk_len * 8))
for i in xrange(1,5):
if(len(junk) % 8 == 0):
print u'decoding to hex'
message = junk.decode("hex")
print 'Hex chars %s' %message
print u' '.join(message.encode("utf-8").strip())
第一行打印没有任何问题,但我无法在不对其进行编码的情况下将其发送到 REST 服务。因此,第二行我试图将其编码为 utf-8。这是失败并显示以下消息的代码行。
UnicodeDecodeError: 'ascii' codec can't decode byte 0x81 in position 7: ordinal not in range(128)
UTF-8 只允许某些位模式。您似乎在代码中使用了 UTF-8,因此您需要符合允许的 UTF-8 模式。
1 byte: 0b0xxxxxxx
2 byte: 0b110xxxxx 0b10xxxxxx
3 byte: 0b1110xxxx 0b10xxxxxx 0b10xxxxxx
4 byte: 0b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx
在多字节模式中,第一个字节表示整个模式中的字节数,前导 1 后跟 0 和数据位 x
。非前导字节都遵循相同的模式:0b10xxxxxx 具有两个前导指示位 10
和六个数据位 xxxxxx
.
一般来说,随机生成的字节不会遵循这些模式。您只能随机生成数据位x
。
正如其他人所说,生成有效的随机 UTF-8 字节非常困难,因为字节序列必须正确。
由于Unicode将所有字符都映射到0x0000到0x10FFFF之间的数字,因此需要做的就是随机生成该范围内的数字以获得有效的Unicode地址。将随机数传递给 unichar
(或 Py3 上的 char
),将 return 随机代码点字符的 Unicode 字符串。
然后您需要做的就是要求 Python 编码为 UTF-8 以创建有效的 UTF-8 序列。
因为,在完整的 Unicode 范围内有很多空白和不可打印的字符(由于字体限制),使用范围 0000-D7FF 和 Basic Multilingual Plane 中的 return 个字符,这将是更有可能由您的系统打印。当编码为 UTF-8 时,这会导致每个字符最多 3 个字节序列。
普通随机
import random
def random_unicode(length):
# Create a list of unicode characters within the range 0000-D7FF
random_unicodes = [unichr(random.randrange(0xD7FF)) for _ in xrange(0, length)]
return u"".join(random_unicodes)
my_random_unicode_str = random_unicode(length=512)
my_random_utf_8_str = my_random_unicode_str.encode('utf-8')
唯一随机
import random
def unique_random_unicode(length):
# create a list of unique randoms.
random_ints = random.sample(xrange(0xD7FF), length)
## convert ints into Unicode characters
# for each random int, generate a list of Unicode characters
random_unicodes = [unichr(x) for x in random_ints]
# join the list
return u"".join(random_unicodes)
my_random_unicode_str = unique_random_unicode(length=512)
my_random_utf_8_str = my_random_unicode_str.encode('utf-8')