我的std :: string是utf-8编码所以很明显,str.length()返回错误的结果.
我发现了这些信息,但我不确定如何使用它来执行此操作:
以下字节序列用于表示字符.要使用的序列取决于字符的UCS代码编号:
Run Code Online (Sandbox Code Playgroud)0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
如何找到UTF-8编码的std :: string的实际长度?谢谢
在OS X和Python中对Unicode文件名进行了一些努力.我试图在代码中稍后使用文件名作为正则表达式的输入,但文件名中使用的编码似乎与sys.getfilesystemencoding()告诉我的不同.请使用以下代码:
#!/usr/bin/env python
# coding=utf-8
import sys,os
print sys.getfilesystemencoding()
p = u'/temp/s/'
s = u'åäö'
print 's', [ord(c) for c in s], s
s2 = s.encode(sys.getfilesystemencoding())
print 's2', [ord(c) for c in s2], s2
os.mkdir(p+s)
for d in os.listdir(p):
print 'dir', [ord(c) for c in d], d
Run Code Online (Sandbox Code Playgroud)
它输出以下内容:
utf-8
s [229, 228, 246] åäö
s2 [195, 165, 195, 164, 195, 182] åäö
dir [97, 778, 97, 776, 111, 776] åäö
Run Code Online (Sandbox Code Playgroud)
因此,文件系统编码是utf-8,但是当我使用它编码我的文件名时,它与我创建具有相同字符串的目录名称不同.我希望当我使用我的字符串åäö创建一个目录,然后读回它的名字时,它应该使用相同的代码,就像我直接应用编码一样.
如果我们查看代码点97,778,97,776,111,776,它基本上是加上变音符号的ASCII字符,例如o +¨=ö,这使得它成为两个字符,而不是一个字符.如何避免这种差异,Python中是否存在一种与OS X匹配此行为的编码方案,为什么getfilesystemencoding()不能给我正确的结果?
还是我搞砸了?
在回顾 JavaScript 概念时,我发现String.normalize(). 这并没有出现在 W3School 的“ JavaScript String Reference ”中,因此,这就是我之前可能错过的原因。
我在HackerRank中找到了更多有关它的信息,其中指出:
返回一个字符串,其中包含调用字符串值的 Unicode 规范化形式。
举个例子:
var s = "HackerRank";
console.log(s.normalize());
console.log(s.normalize("NFKC"));
Run Code Online (Sandbox Code Playgroud)
具有作为输出:
HackerRank
HackerRank
Run Code Online (Sandbox Code Playgroud)
另外,在GeeksForGeeks中:
string.normalize() 是 javascript 中的内置函数,用于返回给定输入字符串的 Unicode 规范化形式。
举个例子:
<script>
// Taking a string as input.
var a = "GeeksForGeeks";
// calling normalize function.
b = a.normalize('NFC')
c = a.normalize('NFD')
d = a.normalize('NFKC')
e = a.normalize('NFKD')
// Printing normalised form.
document.write(b +"<br>");
document.write(c +"<br>");
document.write(d +"<br>");
document.write(e);
</script>
Run Code Online (Sandbox Code Playgroud)
具有作为输出:
GeeksForGeeks
GeeksForGeeks …Run Code Online (Sandbox Code Playgroud) byte arr[] = new byte[] {56, 99, 87, 77, 73, 90, 105, -23, -52, -85, -9, -55, -115, 11, -127, -127};
String s= new String(arr);
Arrays.equals(arr, s.getBytes())); // returns false
Run Code Online (Sandbox Code Playgroud)
为什么数组不相等?我希望getBytes()返回原始字节数组。