Java 不同编程语言的字符编码是否相同?
如何将包含Java 不同编程语言的字符编码是否相同?,java,python,c++,c,char,Java,Python,C++,C,Char,如何将包含char的小写字母转换为int是一种非常简单(也是一种优雅的方式)的方法,如下所示: int convertLowercaseCharLettertoInt(char letter) { return letter - 'a'; } 但是,此代码假定char编码遵循与字母表相同的顺序。或者,更一般地说,它假定char遵循ASCII编码 我知道Javachar是UTF-16,而Cchar是ASCII。尽管UTF-16与ASCII不向后兼容,但前128个字母的顺序在两者中是相同
char
的小写字母转换为int
是一种非常简单(也是一种优雅的方式)的方法,如下所示:
int convertLowercaseCharLettertoInt(char letter) {
return letter - 'a';
}
但是,此代码假定char
编码遵循与字母表相同的顺序。或者,更一般地说,它假定char
遵循ASCII编码
- 我知道Java
是UTF-16,而Cchar
是ASCII。尽管UTF-16与ASCII不向后兼容,但前128个字母的顺序在两者中是相同的<强> >前128个代码< CAR> < /C> > S在所有主要语言中都是相同的,如C、C++、爪哇、C*、JavaScript和Python?<强> < /LI>char
- 一般来说,上面的方法是安全的吗(假设输入经过消毒等)?还是使用hash-map或long
语句方法更好?我认为,哈希映射方法是解决非英语字母问题的最优雅的方法。例如,捷克字母是:a,á,b,c,č,d,ď,E,é,ě,f,g,h,ch,i,í,j,k,l,m,n,ň,o,ó,p,q,r,ř,s,ť,t,ť,u,ů,v,w,x,y,ý,z,žswitch
如果要比较标准之间对应的数字,则存在从一个标准到另一个标准的转换库。就C而言,您不能依赖ASCII执行字符;该标准只要求必须属于它的最小字符集。执行字符集可以是ASCII、EBCDIC、UTF-8等 您的方法是“安全”的,因为它不应该导致segfault或打开安全漏洞,但不能保证返回您期望的结果 对于拉丁字母表,最好创建自己的字符串并将其索引:
char mycharset[] = "abcdefghijklmnopqrstuvwxyz";
if ( isalpha( letter )) // thanks chux.
{
char *pos = strchr( mycharset, tolower( letter ) );
if ( pos )
return (int) (pos - mycharset);
else
return -1; // letter not found
}
return -1; // bad input
对于扩展字母表-我不知道 这与编程语言关系不大,但更多的是关于系统的底层字符集。ASCII和所有Unicode变体的行为将与您预期的一样。”一个“…”是26个连续的代码点。EBCDIC不会,所以在大多数语言的IBM/360上,您的技巧都会失败 Java(和Python,也许还有其他)语言要求使用Unicode编码,而不管底层平台是什么,因此您的技巧在这里也会起作用,假设您可以为您的IBM大型机找到符合要求的Java实现。在C中,编译器可以检测到问题 另请参见代码
注意:以下代码适用于所有C编码
int convertLowercaseOrUppercaseCharLettertoInt(char letter) {
char s[2] = { letter, '\0' };
return strtol(s, 0, 36) - 10;
}
编码由相应的标准定义。ASCII、EBCDIC Unicode或您自己命名的。不,您不能编写一个适合所有人的函数,即使是在
C++
中,也不能使用不同的代码页。主流语言应该尊重US-ASCII编码。但显然,我们不能从所有语言中假设这一点。有些人还不如发明一种语言来抵制这种愤怒的美帝国主义@人们已经发明了这样的语言()和计算机语言。然而,在思想的自由市场中,ASCII竞争性地被许多人广泛采用,而不是通过法令。C不指定ASCII,即使它是用于C代码的主要字符编码。ASCII在C处理的文本文件中很普遍(尽管也不是必需的)。UTF无疑在文本文件中占据了一席之地。例如,我想在计算文本中字母的频率时这样做。那么,为什么您要担心其他编程语言呢?因为它更多地是与习惯相关的问题,而不是与一次性解决方案相关的问题。请注意,这返回26 shouldletter='\0'
“终止的空字符被认为是字符串的一部分。”mycharset
@chux-是的,你应该在搜索之前添加一个isalpha
检查letter
。捕捉得好。我想一个简单的if(letter)
就可以了。@chux-或者那样。不应该同时工作和冲浪(我没有松懈,我的代码正在编译!)你到底为什么不在嵌入式应用程序中使用tolower
?@rici,tolower()
使用的典型表需要257*8或16位,加上其他代码。OP的代码更小,尽管移植性较差,还有其他限制。否则我建议你查询OP.Java使用Unicode编码(UTF16)而不仅仅是任何“Unicode编码”是,和“a”…“z”在所有这些编码中都是连续的。
int convertLowercaseOrUppercaseCharLettertoInt(char letter) {
char s[2] = { letter, '\0' };
return strtol(s, 0, 36) - 10;
}