ASC Visual Basic for Java

3
我需要一个在Java中与Visual Basic的ASC函数相同的函数。我已经在互联网上寻找了它,但是我找不到解决方案。
我需要知道代码的字符串是在Visual Basic上创建的。它根据ISO 8859-1和Microsoft Windows Latin-1字符集创建。Visual Basic的ASC函数知道这些代码,但是在Java中,我找不到相同的函数。
我知道在Java中有这个句子:
String myString = "ÅÛ–ßÕÅÝ•ÞÃ";
int first = (int)string.chartAt(0); // "Å"- VB and Java returns: 197
int second = (int)string.chartAt(0); // "Û" - VB and Java returns: 219
int third = (int)string.chartAt(0); // "–" - VB returns: 150 and Java returns: 8211

前两个字符没有问题,但第三个字符不是ASCII码。

我怎样才能在VB和Java中得到相同的代码?


1
你是指每次都用charAt(0)吗?还有string -> myString?charAt(0)返回一个char,你可以将其强制转换为int。 - Adrian Leonhard
你可能没有意识到,你的“Latin-1”字符串看起来非常像一个UTF8字符串... - Jongware
1个回答

3
首先,请注意 ISO 8859-1 != Windows Latin-1(请参见http://en.wikipedia.org/wiki/Windows-1252)。
问题在于 Java 将字符编码为 UTF16,因此将其强制转换为 int 通常会导致 char 的 Unicode 值。
要获取字符的 Latin-1 编码,请首先将其转换为 Latin-1 编码的字节数组:
public class Encoding {

    public static void main(String[] args) {
        // Cp1252 is Windows codepage 1252
        byte[] bytes = "ÅÛ–ßÕÅÝ•ÞÃ".getBytes(Charset.forName("Cp1252"));
        for (byte b: bytes) {
            System.out.println(b & 255);
        }
    }

}

打印:

197
219
150
223
213
197
221
149
222
195

它运行得很好!非常感谢。您的解释对于理解问题和解决方案非常出色。 - Marcelo Gonzaga Silva
1
了解VB6的Asc()函数是一个缓慢而过时的功能,仅用于向后兼容,并已被AscW()替换,这很有帮助。旧的Asc()首先转换为ANSI。但是,上面给出的Java代码不等同,当当前代码页是其他内容时,它会崩溃,而VB6的Asc()始终使用当前代码页而不是硬编码代码页。我不知道为什么上面的代码要将字节值与255相与,看起来像是货物崇拜。 - Bob77
1
@Bob77 println(byte) 会输出大于127的负值。 - Adrian Leonhard
啊,我的错误。这表明我没有注意! - Bob77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接