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
    char
    是UTF-16,而C
    char
    是ASCII。尽管UTF-16与ASCII不向后兼容,但前128个字母的顺序在两者中是相同的<强> >前128个代码< CAR> < /C> > S在所有主要语言中都是相同的,如C、C++、爪哇、C*、JavaScript和Python?<强> < /LI>
  • 一般来说,上面的方法是安全的吗(假设输入经过消毒等)?还是使用hash-map或long
    switch
    语句方法更好?我认为,哈希映射方法是解决非英语字母问题的最优雅的方法。例如,捷克字母是: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,ž

为什么您要用自己的方式将字母转换成数字,当然有一些标准描述了这一点,例如UTF-16、ASCII UTF-8、拉丁语、拉丁语-2。。。如果你问是否所有语言都实现了标准,那么答案可能是肯定的。但是如果你问字符是否在所有语言中都是相同的编码,那么答案是否定的。它们是否提供顺序字母表表示。。。我对此表示怀疑


如果要比较标准之间对应的数字,则存在从一个标准到另一个标准的转换库。

就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 should
letter='\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;
}