正如标题所说的那样.
$ ./configure --help | grep -i ucs
--enable-unicode[=ucs[24]]
Run Code Online (Sandbox Code Playgroud)
搜索官方文档,我发现了这个:
sys.maxunicode:一个整数,给出Unicode字符支持的最大代码点.其值取决于配置选项,该选项指定Unicode字符是否存储为UCS-2或UCS-4.
这里不清楚的是 - 哪些值对应于UCS-2和UCS-4.
该代码预计适用于Python 2.6+.
今天我醒来后觉得我的代码和我用过的每个图书馆都出现了严重问题,我认为我是对的......(或者请指出我的推理错误的地方)
让我们回到过去十年或者两年,一切都在世界上很好.我跟我的邻居说话,他讲的是同一种语言:只是简单的英语.对我来说,我的邻居和Windows似乎很明显将我们的字符串存储在8位char
s中,因为我们使用的所有字符都可以存储在2 ^ 8 = 256种可用组合中.
然后奇迹般的互联网出现了,并允许我与欧洲的一些朋友(他们没有时间学习英语)交谈.这很难用我们的char
格式,使用的字符数量很容易超过256,所以在我们完全简单的视觉中我们决定使用16位wchar_t
s.称为UCS-2 unicode的东西.它有2 ^ 16 = 65.536种可用组合,对于世界上的每种语言都必须足够!相信我们的正确性,我们甚至还添加了16位的Windows API的W
功能,如MessageBoxW
和CreateWindowW
.我们说服了每个程序员我们的宗教,并且不鼓励使用邪恶的8位对应物(MessageBoxA
和CreateWindowA
)并通过在我们的构建中定义来MessageBox
自动映射调用.因此我们也应该使用函数而不是旧函数(例如,现在应该使用,或者使用自动映射).MessageBoxW
_UNICODE
wcs
str
strlen
wcslen
_tcslen
然后事情变得糟糕,事实证明世界上还有其他人使用甚至比我们更怪异的字形(没有冒犯):日本人,中国人等等.它变坏了,因为例如中国人有超过70,000个不同的字符.发生了很多咒骂,给我们留下了一种新型的unicode:UTF-16.它还使用16位数据类型,但某些字符需要两个16位值(称为代理对).这意味着我们不能在这些16位字符串上使用索引(例如,theString [4]可能不会返回第5个字符).为了修补Windows API,决定所有W
函数现在应该支持UTF-16格式,这是一个简单的决定,因为所有旧的UCS-2字符串也是有效的UTF-16字符串.但是,因为我们是勇敢的程序员,所以我们现在使用这些wcs
功能.遗憾的是,这些功能不具有代理意识,仍然符合UCS-2格式......
与此同时,在一个黑暗的阁楼里,开发了另一种更紧凑的unicode形式:UTF-8.使用8位数据类型,大多数西方语言可以存储在一个8位值中,就像过去一样.当存储更奇特的字形时,使用多个8位值,对于大多数欧洲语言2就足够了.但是,它可能会扩展其中4个值,实质上是创建32位存储类型.就像它的胖兄弟UTF-16一样,我们不能在这些字符串上使用索引.由于它更紧凑的格式,UTF-8现在在互联网上的各个地方广泛使用,因为它节省了带宽.
很好,你是通过我冗长的写作来实现的:)现在我有一些问题/兴趣点:
好的,我对使用UTF-8进行存储非常满意.当我读取一个文件(来自磁盘或HTTP响应)时,我检测到UTF-8签名"\xEF\xBB\xBF"
并将内容放在MultiByteToWideChar
我的UTF-16字符串中.我可以使用W
API函数,没问题.但是现在我想修改字符串,替换一些字符等.好的旧wcs
函数不再好了,哪些核心字符串函数是UTF-16识别的?还是有一些出色的图书馆,我不知道吗?编辑:似乎ICU是一个非常好的解决方案.我还发现这些wcs
函数并不是完全无用的,你可以用来wcsstr
搜索,它基本上只是比较wchar_t
s.唯一的问题是字符串的长度.
当我们被迫使用16位缺陷W
函数时,你是否感觉到了一个丑陋的错误.难道问题不应该在更早的阶段得到认可,并且让所有原始API函数都采用UTF-8字符串并包含适当的字符串操作例程吗?或者这已经是可能的,我可怕的错了吗?编辑:也许这是一个愚蠢的问题,后见之明确实很精彩,现在没有人放下任何人;)
为了快速索引字符,我们应该以32位值存储字符串.这是常见的吗?(我可以听到你的想法:然后我们遇到了一种需要更多组合的外星语言,并且乐趣又重新开始...)这种方法的缺点似乎是我们应该每次将字符串转换回UTF-16我们进行Windows API调用.编辑:引用Alf P. Steinbach 每个指数一个角色是一个绝望的梦想,我现在看到了.我完全错过的一件事是变音符号.我也认为在OS的本机编码中处理是一件好事(对于Windows …
更新了问题¹
关于字符类,比较,排序,规范化和排序规则,哪些.NET平台支持哪些Unicode版本?
原始问题
我记得有点模糊地读过.NET支持Unicode 3.0版,内部UTF-16编码不是真正的UTF-16,但实际上使用的是UCS-2,这是不一样的.例如,似乎U + FFFF以上的字符是不可能的,即考虑:
string s = "\u1D7D9"; // ("Mathematical double-struck digit one")
Run Code Online (Sandbox Code Playgroud)
它存储字符串"?9"
.
我基本上是在寻找以下答案的确切参考:
¹)我随着时间的推移更新了问题,对于答案和更大的社区来说似乎更合适.我留下原来的问题来代替评论中回答了哪些部分.在现有的32位Windows版本中也使用了旧的UCS-2(没有代理),.NET一直在内部使用UTF-16(带有代理).
我有一个Unicode文本块,像这样:
?
?
?
?
?
?
?
Run Code Online (Sandbox Code Playgroud)
现在,我想将此原始Unicode文本块转换为UTF-8(HEX)代码点的文本块(请参阅此页面上的十六进制UTF-8列:https://en.wikipedia.org/wiki/UTF-8),by PHP
; 像这样:
\xe1\xbb\xa5
\xc6\xb0
\xe1\xbb\xa9
\xe1\xbb\xb2
\xe1\xbb\xb6
\xe1\xbb\xb4
\xc4\x90
Run Code Online (Sandbox Code Playgroud)
不是这样的:
0x1EE5
0x01B0
0x1EE9
0x1EF2
0x1EF6
0x1EF4
0x0110
Run Code Online (Sandbox Code Playgroud)
用PHP做任何方法吗?
我已经阅读了这个主题(PHP:将unicode codepoint转换为UTF-8).但是,它与我的问题不相似.
对不起,我不太了解Unicode
.
我仍在尝试决定我的(home)项目是否应该使用UTF-8字符串(在必要时使用std :: string和其他特定于UTF-8的函数实现)或一些16位字符串(实现为std: :wstring的).该项目是一种编程语言和环境(如VB,它是两者的结合).
有一些愿望/约束:
目前,我正在使用std :: string,目的是仅在必要时使用UTF-8操作函数.它需要更少的内存,似乎是许多应用程序正在进行的方向.
当我运行我的Python代码时,我收到以下错误:
File "E:\python343\crawler.py", line 31, in <module>
print (x1)
File "E:\python343\lib\idlelib\PyShell.py", line 1347, in write
return self.shell.write(s, self.tags)
UnicodeEncodeError: 'UCS-2' codec can't encode characters in position 1050-1050: Non-BMP character not supported in Tk
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
x = g.request('search', {'q' : 'TaylorSwift', 'type' : 'page', 'limit' : 100})['data'][0]['id']
# GET ALL STATUS POST ON PARTICULAR PAGE(X=PAGE ID)
for x1 in g.get_connections(x, 'feed')['data']:
print (x1)
for x2 in x1:
print (x2)
if(x2[1]=='status'):
x2['message']
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我已经得到了一个UCS-2编码的xml文档,我已经设法在经过一些调整后基于minidom构建了一个DOM.
问题是我应该在base64上编码一些数据.我知道一个事实:
AME= (or \x00A\x00M\x00E\x00=) is base64 code for Á
Run Code Online (Sandbox Code Playgroud)
我该如何解码呢?
http://www.fileformat.info/info/unicode/char/00c1/index.htm显示Á的unicode表示形式为:u"\ u00C1"和UTF-16:0x00C1
base64.b64decode('AME=').decode('UTF-16')
Run Code Online (Sandbox Code Playgroud)
节目
u'\uc100'
Run Code Online (Sandbox Code Playgroud)
作为字符的unicode表示,但它看起来是字节交换的.
有关如何解码的任何想法?
似乎SQL Server 对字段使用Unicode UCS-2,一个2字节的固定长度字符编码nchar/nvarchar
.同时,C#对其字符串使用Unicode UTF-16编码(注意:有些人不认为UCS-2是Unicode,但它在Unicode子集0-0xFFFF中编码与UTF-16相同的所有代码点,并且就SQL Server而言,就字符串而言,它本身支持的"Unicode"最接近它.)
虽然UCS-2在基本多语言平面(BMP)中对与UTF-16相同的基本代码点进行编码,但它不保留UTF-16允许代理对的某些位模式.
如果我将C#字符串写入SQL Server nvarchar
(UCS-2)字段并将其读回,这是否会返回相同的结果?
看来尽管UTF-16是UCS-2的意义上的超集UTF-16编码更多的代码点(例如上述0xFFFF)时,它实际上是UCS-2的2字节级的子集,因为它是限制性更强.
为了回答我自己的问题,我怀疑如果我的C#字符串包含高于0xFFFF的代码点(由字符对表示),这些将在数据库中存储和检索得很好,但如果我试图在数据库中操作它们(例如也许调用TOUPPER或试图删除所有其他字符),然后我可能会遇到一些问题,以后显示字符串...除非SQL Server具有确认代理对并有效地将nchar/nvarchar
字符串视为UTF-16的函数.
我正在寻找一个php中的代码/ lib,我会调用它并将文本传递给它,它会告诉我:
你知道任何代码/ lib存在会为我做这个吗?
我再也不想发送短信或转发短信,只是为了给我提供有关短信的信息
更新:
好的,我做了下面的代码,似乎工作正常,如果你有更好的/优化的代码/解决方案/ lib,请告诉我
$text = '\@£$¥èéùìòÇØøÅå?_?????????ÆæßÉ -./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà^{}[~]|€' ; //"\\". //'"';//' ';
print $text . "\n";
print isGsm7bit($text). "\n";
print getNumberOfSMSsegments($text). "\n";
function getNumberOfSMSsegments($text,$MaxSegments=6){
/*
http://en.wikipedia.org/wiki/SMS
Larger content (concatenated SMS, multipart or segmented SMS, or "long SMS") can be sent using multiple messages,
in which case each message will start with a user data header (UDH) containing segmentation information.
Since UDH is part of the payload, the number of available characters per …
Run Code Online (Sandbox Code Playgroud) 我们想将Confluence系统移动到SQL Server 2008 R2.现在,由于Confluence使用UTF-8编码,我需要一个使用相同编码的数据库(我猜这是整理?).
这是命令
alter database confluence set collation COLLATION_NAME
Run Code Online (Sandbox Code Playgroud)
现在看来,没有utf-8,而且我发现SQL Server使用的ucs-2基本相同.但我无法弄清楚ucs-2的校对名称是什么?有人知道吗?
编辑:我确实看到了编码和整理之间的区别.Confluence 文档建议我应该创建一个依赖于UCS-2的模式(因为MS SQL缺少对UTF-8的支持).我查看了Managment Studio,并在数据库的Security目录中找到了一个模式条目.但是,我无法弄清楚如何将UCS-2编码分配给架构.我有什么要在Managment Studio中实现这一点(或者我应该使用哪个查询)?