【问题标题】:ASC Visual Basic for JavaASC Visual Basic for Java
【发布时间】:2015-04-23 10:37:21
【问题描述】:

我需要一个 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 中获得相同的代码?

【问题讨论】:

  • 你的意思是每次都 charAt(0) 吗?还有字符串-> myString? charAt(0) 返回一个 char,您可以将其转换为 (int) 为 int
  • 您可能不知道您的“Latin-1”字符串可疑地看起来像一个 UTF8 字符串...

标签: java vb6 ascii non-ascii-characters


【解决方案1】:

首先,请注意 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

【讨论】:

  • 它工作正常!非常感谢。您的解释非常有助于理解问题和解决方案。
  • 了解 VB6 的 Asc() 函数是一个缓慢且过时的功能,用于向后兼容,已被 AscW() 取代。旧的Asc() 也首先转换为 ANSI。但是上面在 Java 中给出的代码是不等价的,当当前代码页是别的东西时会崩溃,其中 VB6 的 Asc() 总是使用当前代码页而不是硬编码的代码页。我不知道为什么上面的代码将字节值与 255 进行 AND 运算,这看起来像是货物崇拜。
  • @Bob77 println(byte) 将为高于 127 的值输出负值。
  • 啊,我的错。说明我没有注意!
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
相关资源
最近更新 更多