2

我有一个包含一个句子的字节数组。我需要将这句话上的小写字母转换成大写字母。这是我所做的功能:

 public void CharUpperBuffAJava(byte[] word) {
     for (int i = 0; i < word.length; i++) {
        if (!Character.isUpperCase(word[i]) && Character.isLetter(word[i])) {
            word[i] -= 32;
        }
     }
    return cchLength;
 }

它可以很好地处理诸如“一杯水”之类的句子。问题是它必须适用于所有 ANSI 字符,包括 "ç,á,é,í,ó,ú" 等等。Character.isLetter 方法不适用于这些字母,因此它们不会转换为大写字母。

您知道如何将这些 ANSI 字符识别为 Java 中的字母吗?

编辑

如果有人想知道,我在回答后再次做了方法,现在看起来像这样:

public static int CharUpperBuffAJava(byte[] lpsz, int cchLength) {
    String value;
    try {
        value = new String(lpsz, 0, cchLength, "Windows-1252");
        String upperCase = value.toUpperCase();
        byte[] bytes = upperCase.getBytes();
        for (int i = 0; i < cchLength; i++) {
            lpsz[i] = bytes[i];
        }
        return cchLength;
    } catch (UnsupportedEncodingException e) {
        return 0;
    }
}
4

5 回答 5

2

你不能简单地使用:

String s = new String(bytes, "cp1252");
String upper = s.toUpperCase(someLocale);
于 2012-09-12T18:19:09.863 回答
2

将字节数组转换为字符串,支持编码。然后调用toUpperCase()。然后,如果您需要在大写后将其作为字节数组,您可以在字符串上调用getBytes() 。

于 2012-09-12T18:19:44.687 回答
2

您需要将其“解码”byte[]为字符串。有几个 API 可以做到这一点,但您必须指定用于字节的字符编码。不使用编码的重载版本会在不同的机器上给出不同的结果,因为它们使用平台默认值。

例如,如果您确定字节是使用 Windows-1252(有时称为 ANSI)编码的。

String s = new String(bytes, "Windows-1252"); 
String upper = s.toUpperCase();
于 2012-09-12T18:23:06.980 回答
0

在转换之前不会改变字符集吗?Java 的内部转换逻辑可能工作正常。类似于http://www.exampledepot.com/egs/java.nio.charset/ConvertChar.html,但使用 ASCII 作为目标字符集。

于 2012-09-12T18:21:27.957 回答
0

我在看这张表:

http://slayeroffice.com/tools/ascii/

但是任何大于 227 的东西似乎都是一个字母,但要使其大写,您将从 ASCII 值中减去 27。

于 2012-09-12T18:21:28.557 回答