我正在阅读一些关于 Unicode 的问题,其中有一些我不完全理解的评论,例如:
Dean Harding:UTF-8是一种变长编码,处理起来比定长编码更复杂。另外,请参阅我对 Gumbo 答案的评论:基本上,所有编码(UTF-8、UTF-16 和 UTF-32)中都存在组合字符,并且它们需要特殊处理。您可以使用与组合字符相同的特殊处理来处理 UTF-16 中的代理项对,因此在大多数情况下您可以忽略代理项并将 UTF-16 视为固定编码。
我对最后一部分(“大部分”)有点困惑。如果UTF-16被视为固定的16位编码,这会导致什么问题?存在 BMP 之外的字符的可能性有多大?如果存在,如果您假设为两字节字符,这可能会导致什么问题?
我阅读了关于代孕者的维基百科信息,但它并没有真正让我更清楚事情!
编辑:我想我真正的意思是“为什么有人建议将 UTF-16 视为固定编码,而它看起来是假的?”
编辑2:
我在“ Is There Any Reasons to Preferred UTF-16 over UTF-8? ”中找到了另一条评论,我认为这更好地解释了这一点:
Andrew Russell:就性能而言:UTF-8 比 UTF-16 更难解码。在 UTF-16 中,字符要么是基本多语言平面字符(2 字节),要么是代理对(4 字节)。UTF-8 字符可以是 1 到 4 个字节之间的任意位置
这表明 UTF-16 不会有任何三字节字符,因此通过假设 16 位,您不会因减少一个字节而“完全搞砸”。但我仍然不相信这与假设 UTF-8 是单字节字符有什么不同!
我有一个希伯来语文本"×??¸×¨?´×™×??°×?ו?¹×?",我想将它转换为可读的 unicode 希伯来语字符。
我试过这个代码:
const string Str = "×??¸×¨?´×™×??°×?ו?¹×?";
Encoding enc1 = Encoding.Default;
Encoding enc2 = Encoding.Unicode;
byte[] bytes = enc1.GetBytes(Str);
string hebrewString = enc2.GetString(bytes);
label1.Text = hebrewString;
Run Code Online (Sandbox Code Playgroud)
但它没有成功。请帮忙。
更新 文本来自html源代码
Version:1.0
StartHTML:000000210
EndHTML:000006218
StartFragment:000001595
EndFragment:000006126
StartSelection:000001595
EndSelection:000006126
SourceURL:file:///C:/ProgramData/Babylon/LocalUI/wnd.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC- html401-19991224/loose.dtd">
<HTML
xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>CLient build #1.2</TITLE><LINK
rel=stylesheet type=text/css href="img/frame.css?ver=41"><LINK rel=stylesheet
type=text/css href="img/baby.css?ver=41"><LINK rel=stylesheet type=text/css
href="img/word.css?ver=41"><LINK rel=stylesheet type=text/css
href="img/text.css?ver=41">
<SCRIPT type=text/javascript src="js/moudles.js?ver=100"></SCRIPT>
<SCRIPT type=text/javascript src="js/extrnl.js?ver=100"></SCRIPT>
<SCRIPT type=text/javascript src="js/frame.js?ver=100"></SCRIPT>
<SCRIPT type=text/javascript src="js/word.js?ver=100"></SCRIPT>
<SCRIPT type=text/javascript …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取其中包含 unicode 的电子邮件地址。就像\xd0\xb5\xd0\xba\xd0\xb7\xd0\xb0\xd0\xbc\xd0\xbf\xd0\xbb@example.com。我尝试过中文网站(http://www.sina.com.cn/)、gmail.com,甚至我自己的namecheap 托管网站。它们都只要求 ASCII 字符。我正在尝试测试和更新库,但想测试其中包含 unicode 的真实电子邮件地址。
\n我正在尝试使用 cpanfile 和 cpanm 来安装大量模块。其中一个模块 Unicode::String 在 CPAN 上有一个错误,作者仅在 Github 上修复了该错误。(https://github.com/msouth/Unicode-String)
是否可以将 Github 存储库列为 cpanfile 中的要求,并从那里而不是从 CPAN 安装 cpanm?如果是这样,这样做的正确语法是什么?
我发现的最接近的是 2013 年的一条线索,宫川说它将在未来的版本中推出,然后未来的版本很脆弱并且被搁置:
https://github.com/perl-carton/carton/issues/132 (这里讨论 carton,但由于它们都使用 cpanfile,因此语法应该相同。)
根据维基百科,2017 年,使用大写字母\xe1\xba\x9e(Unicode U+1E9E) 被正式采用——至少作为一种选择——实际上可能是德语中全大写单词的子集:
同年 6 月,德国正字法委员会正式通过了一项规则,\xe2\x9f\xa8\xe1\xba\x9e\xe2\x9f\xa9 将成为 \xe2\x9f\xa8\xc3\x9f 大写的选项\xe2\x9f\xa9 除了之前的大写形式 \xe2\x9f\xa8SS\xe2\x9f\xa9 之外(即变体 STRASSE 和 STRA\xe1\xba\x9eE 将被视为同等有效)。2
\n似乎对德语的这一补充将大大简化字符串之间的大小写比较(所谓的“大小写折叠”或“折叠大小写”比较)。注意,我开始这个询问是为了理解 Raku(又名 Perl6)的实现,但实际上这个问题似乎可以推广到其他编程语言。这是 Raku 的默认实现 - 从rfdr_Regeln_2017.pdf中的 13 个单词开始,这些单词已小写(通过 Raku 的.lc函数):
~$ cat TO_\xe1\xba\x9e_OR_NOT_TO_\xe1\xba\x9e.txt\nma\xc3\x9f stra\xc3\x9fe grie\xc3\x9f spie\xc3\x9f gro\xc3\x9f gr\xc3\xbc\xc3\x9fen au\xc3\x9fen au\xc3\x9fer drau\xc3\x9fen strau\xc3\x9f bei\xc3\x9fen flei\xc3\x9f hei\xc3\x9fen\n~$ raku -ne \'.words>>.match(/^ <:Ll>+ $/).say;\' TO_\xe1\xba\x9e_OR_NOT_TO_\xe1\xba\x9e.txt\n(\xef\xbd\xa2ma\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2stra\xc3\x9fe\xef\xbd\xa3 \xef\xbd\xa2grie\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2spie\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2gro\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2gr\xc3\xbc\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2au\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2au\xc3\x9fer\xef\xbd\xa3 \xef\xbd\xa2drau\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2strau\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2bei\xc3\x9fen\xef\xbd\xa3 \xef\xbd\xa2flei\xc3\x9f\xef\xbd\xa3 \xef\xbd\xa2hei\xc3\x9fen\xef\xbd\xa3)\n~$ raku -ne \'.uc.say;\' TO_\xe1\xba\x9e_OR_NOT_TO_\xe1\xba\x9e.txt\nMASS STRASSE GRIESS …Run Code Online (Sandbox Code Playgroud) 如果您对Python一无所知我会道歉,但是,以下代码段对任何人都应该是非常易读的.值得注意的唯一技巧 - 为列表编制索引[-1]会为您提供最后一个元素(如果存在)或引发异常.
>>> fileName = 'TheFileName.Something.xMl'
>>> fileNameList = fileName.split('.')
>>> assert(len(fileNameList) > 1) # Must have at least one period in it
>>> assert(fileNameList[-1].lower() == 'xml')
>>> fileNameList[-1] = 'bak'
>>> fileName = '.'.join(fileNameList)
>>> print(fileName)
TheFileName.Something.bak
Run Code Online (Sandbox Code Playgroud)
我需要将这个逻辑转换为C++(我实际使用的语言,但到目前为止已经很糟糕)的函数具有以下签名:void PopulateBackupFileNameOrDie(CAtlString& strBackupFileName, CAtlString& strXmlFileName);.这里strXmlFileName是"输入",strBackupFileName是"输出"(我应该反转两个的oprder吗?).棘手的部分是(纠正我,如果我错了)我正在使用Unicode字符串,所以寻找这些字符:.xmlXML不是那么直截了当.最新的Python没有这些问题,因为'.'和"."都是Unicode字符串(不是"char"长度为1型),二者只包含一个点.
请注意,返回类型是void- 不要太担心它.我不想向您详细介绍我们如何将错误传达给用户.在我的Python示例中,我只使用了一个断言.你可以做类似的事情,或者只是添加评论// ERROR: [REASON].
请问是否有问题.建议使用std::string,而不是CAtlString功能参数不是我要找的.如果必须,您可以在函数内部转换它们,但我不希望在一个函数中混合使用不同的字符串类型.我正在使用VS2010在Windows上编译这个C++.这意味着我不会安装BOOST,QTString或者其他不可用的库.窃取一个boost或其他标题以启用一些魔法也不是正确的解决方案.
谢谢.
我想通过在线服务发送中文字符,并返回生成的英文字符串.我正在使用简单的JSON和urllib.
是的,我在宣布.
# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)
在我的代码之上.
现在一切正常,如果我给urllib一个字符串类型的对象,即使该对象包含什么是Unicode信息.我的功能被调用translate.
例如:
stringtest1 = '???????'
print translate(stringtest1)
Run Code Online (Sandbox Code Playgroud)
导致正确的翻译和做
type(stringtest1)
Run Code Online (Sandbox Code Playgroud)
确认这是一个字符串对象.
但如果这样做
stringtest1 = u'???????'
Run Code Online (Sandbox Code Playgroud)
并尝试使用我的翻译功能我收到此错误:
File "C:\Python27\lib\urllib.py", line 1275, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-8: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
经过一番研究,似乎这是一个常见的问题:
现在,如果我输入一个脚本
stringtest1 = '???????'
stringtest2 = u'???????'
print 'stringtest1',stringtest1
print 'stringtest2',stringtest2
Run Code Online (Sandbox Code Playgroud)
执行它返回:
stringtest1 無與倫比的美麗
stringtest2 ???????
Run Code Online (Sandbox Code Playgroud)
但只需在控制台中键入变量:
>>> stringtest1
'\xe7\x84\xa1\xe8\x88\x87\xe5\x80\xab\xe6\xaf\x94\xe7\x9a\x84\xe7\xbe\x8e\xe9\xba\x97'
>>> stringtest2
u'\u7121\u8207\u502b\u6bd4\u7684\u7f8e\u9e97'
Run Code Online (Sandbox Code Playgroud)
抓住我的.
我的问题是我无法控制要翻译的信息如何影响我的功能.而且似乎我必须以Unicode格式提供它,该函数不接受它.
那么,我如何将一件事转换成另一件事呢?
我已经阅读了Stack …
我正在尝试构建一个(测试)WideString:
但使用它的分解形式:
所以我有代码片段:
var
test: WideString;
begin
test := #$0061#$0301;
MessageBoxW(0, PWideChar(test), 'Character with diacratic', MB_ICONINFORMATION or MB_OK);
end;
Run Code Online (Sandbox Code Playgroud)
除了它似乎不起作用:

这可能是一个错误MessageBox,但我会继续说,它更可能是我的代码中的错误.
我尝试过的其他一些变化:
test := WideString(#$0061#$0301);
const
SmallLetterLatinAWithAcuteDecomposed: WideString = #$0061#$0301;
test := SmallLetterLatinAWithAcuteDecomposed
test := #$0061+#$0301; (Doesn't compile; incompatible types)
test := WideString(#$0061)+WideString(#$0301); (Doesn't compile; crashes compiler)
test := 'a'+WideString(#$0301); (Doesn't compile; crashes compiler)
//Arnauld's thought:
test := …Run Code Online (Sandbox Code Playgroud) 我收到了来自webservice的字符串,其中包含Unicode字符.我想将其转换为纯NSString.那我该怎么做?
例如:"这不是你的自行车"
那么如何删除unicode并用其相同的特殊符号替换它.
输出将是:"这不是你的自行车"
我正在尝试编译我已经声明为类成员的项目:
icu::UnicodeString label;
icu::UnicodeString tags;
icu::UnicodeString domain;
icu::UnicodeString data;
Run Code Online (Sandbox Code Playgroud)
包括之后(是的,它被发现)
#include <unicode/unistr.h>
Run Code Online (Sandbox Code Playgroud)
在我的CMakeLists.txt中,它搜索,查找和链接:icuuc icudata(libicuuc,libicudata),如输出在抛出错误之前所建议的:
-o icarus -rdynamic -lPocoNet -lPocoUtil -lPocoXML -licuuc -licudata
我已经从源icu4c 50.1.2构建和安装,并在/ usr/local/*下安装了cmake正确查找库,因为我的错误来自链接阶段:
未定义的引用
icu_50::UnicodeString::UnicodeString()' undefined reference toicu_50 :: UnicodeString :: ~UnicodeString()'
我在Debian Wheezy上使用gcc-4.7.2并启用-std = c ++ 0x.完全相同的代码昨晚用Debian Squeeze上的gcc-4.3.2和相同的标志进行编译!
我不能为我的生活,弄清楚我做错了什么!请帮忙!