【问题标题】:How do I recognize a character such as "ç" as a letter?如何将诸如“ç”之类的字符识别为字母?
【发布时间】:2012-09-05 19:42:19
【问题描述】:

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

 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 方法不适用于这些字母,因此不会将它们转换为大写。

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

编辑

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

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;
    }
}

【问题讨论】:

  • 重新标记;有些人所说的“ANSI 字符”实际上是 Windows CP-1252; [ANSI] 标签指的是组织。
  • @Truth:PHP 不是 Java。
  • 是的。它是。这是怎么复制的?
  • 你为什么要使用lpsz 来描述一个不是长指针、甚至不是指针、也不指向空终止字符串的参数?让我们将匈牙利符号保留在它所属的地方,无论它在哪里;-)
  • @EJP 我只是想保留原来的 windows 函数签名:msdn.microsoft.com/en-us/library/windows/desktop/…

标签: java cp1252


【解决方案1】:

你不能简单地使用:

String s = new String(bytes, "cp1252");
String upper = s.toUpperCase(someLocale);

【讨论】:

    【解决方案2】:

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

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

    String s = new String(bytes, "Windows-1252"); 
    String upper = s.toUpperCase();
    

    【讨论】:

    • 成功了!我用新版本的方法更新了这个问题,以防万一有一天有人想使用它。
    【解决方案3】:

    我在看这张表:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-30
          • 1970-01-01
          • 2012-04-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多