Java中字符数组与字符串序列在Unicode字符方面不匹配。

3

我有一个方法如下所示(请忽略代码优化问题)。这个方法替换Unicode字符(孟加拉字符)

static String swap(String temp, char c) 
{
    Integer length=temp.length();
    char[] charArray = temp.toCharArray();
      for(int u=0;u<length;u++)
        {           
            if(charArray[u]==c)
            {
                    char g=charArray[u];
                    charArray[u]=charArray[u-1];
                    charArray[u-1]=g;
            }                   
        }
    String string2 = new String(charArray);
    return string2;
}

在调试过程中,我得到了charArray的值,如下图所示: enter image description here
请注意,字符以我想要的顺序排列。
但是,在执行语句后,存储在字符串变量中的值不匹配。如下所示: enter image description here
我想将字符串显示为“রেরেরে”,但它显示为“েরেরের”,这不是我想要的。请告诉我我做错了什么。

3个回答

7
注意 - 我不懂孟加拉语,但我知道一些(或者根据不同的人会有很多)关于Unicode及其在Java中的支持。本答案假设你已经了解后者而不是前者。
根据Unicode 6.0孟加拉语图表রে是一个由依赖元音符号(0x09C7)和辅音(0x09B0)组成的组合,并且在字符数组中表示为两个字符序列。
如果你只得到了依赖元音符号,而没有得到组合后的字符序列(因此也没有得到字符串),那么你的优化可能是可笑的,因为它似乎假定Unicode中的孟加拉语字符可以表示为单个Unicode代码点或Java中的单个char变量;这将导致一个辅音被另一个辅音替换,但是在辅音之前的依赖元音永远不会被替换。
我认为正确的优化必须考虑到有依赖的元音,并且除了元音之外还要比较下一个辅音,即必须比较字符数组中的两个字符,而不是单个字符。这也可能意味着您的方法签名必须更改,以允许传递char[],而不是单个char,以便可以用预期的孟加拉语字符替换孟加拉语字符,而不是替换为另一个Unicode代码点,这是当前正在进行的操作。
其他答案中关于ArrayIndexOutofBoundsException的注释是有效的。以下示例使用您的字符替换算法,演示了您的算法不仅不正确,而且很可能会抛出异常:
class CodepointReplacer
{

    public static void main(String[] args)
    {
        String str1 = "রেরেরে";
            /* 
             * The following is a linguistically invalid sequence,
             * but Java does not concern itself with linguistical correctness
             * if the String or char sequence has been constructed incorrectly.
             */
        String str2 = "েরেরের"; 
            /*
             * replacement character র for our strings
             * It is not রে as one would anticipate.
             */ 
        char c = str1.charAt(1);

        optimizeKookily(str1, c);
        optimizeKookily(str2, c);
    }

    private static void optimizeKookily(String temp, char c)
    {
        Integer length = temp.length();
        char[] charArray = temp.toCharArray();
        for (int u = 0; u < length; u++)
        {
            if (charArray[u] == c)
            {
                char g = charArray[u];
                charArray[u] = charArray[u - 1]; //throws exception on second invocation of this method.
                charArray[u - 1] = g;
            }
        }
    }
}

因此,更好的字符替换策略是使用String.replaceCharSequence变体)或String.replaceAll函数,假设您知道如何在孟加拉语字符中使用它们。

嗨。谢谢。但是它没有起作用。错误:“使用'Cp1252'字符编码无法映射某些字符。”实际上,我们从我们的Web服务以XML格式生成以下Unicode序列。"String s="\u09B0\u09C7\u09B0\u09C7\u09B0\u09C7";" 它代表在MS Word或记事本中的孟加拉字体中的“রেরেরে”。但由于Android不支持语音孟加拉表示,因此显示不正确。因此,我们想要替换字符。对于单个替换,它效果很好。但对于单词中的多个替换,它不起作用。我们正在使用http://macchiato.com/unicode/convert.html - Foyzul Karim
顺便问一下,你会用什么来替换这个序列\u09B0\u09C7\u09B0\u09C7\u09B0\u09C7? 如果你需要解决这个特定需求,我可以尝试提供一个解决方案。但是如果你想要理解它的工作原理,那你需要了解3个孟加拉字符在Java中如何映射到6个字符,并且为什么替换1个Java字符是不好的想法。 - Vineet Reynolds
另外,如果您不理解之前的评论,请查看由McDowell编写的此字符检查器应用程序,您可以粘贴字符串রেরেরেেরেরের并查看Unicode代码点表示。通过将\u09B0\u09C7替换为\u09C7\u09B0,您确实没有实现任何有用的东西。 - Vineet Reynolds
非常感谢您的时间。谢谢。但不幸的是,Android 无法像我们在记事本或 Word 中编写的方式那样显示孟加拉文本。在 Android 解决此问题之前,我们必须更改此序列。没有其他办法。 - Foyzul Karim
我认为你没有理解这里的任何内容。你当前的代码已经改变了顺序,符合你的期望,但是它是无效的,并且对于任何应用程序(包括Android应用程序)都没有意义。只要个别字符继续是孟加拉语,改变序列不会改变任何东西。任何渲染器都将继续将字符解释为孟加拉语。 - Vineet Reynolds
显示剩余5条评论

0

问题出在

    for(int u=0;u<length;u++)
            {           
                if(charArray[u]==c)
                {
                        char g=charArray[u];
                        charArray[u]=charArray[u-1];
                        charArray[u-1]=g;
                }                   
            }
See when u=0 what is the value of charArray[u-1] that is the index -1.Modify your for loop or just put the condition where u=0.

你没有理解重点。我在图片中展示了场景。如果像你所提到的那样存在任何问题,它会抛出IndexOutOfBound异常或类似的异常。我说得对吗? - Foyzul Karim
也许更好的方法是了解您想如何修改charArray以获得新字符串。 - Rasel
再次强调,不处理这种错误是不好的编程实践。 - Rasel
我已经在上一次提到了我想要的东西。所以,无论以何种方式实现,我都没有问题。也许可以给出一些建议。 - Foyzul Karim
你想从 string2 中显示你所需的序列吗? - Rasel
如果你检查charArray变量,序列是正确的。但问题是当我从这些字符中创建一个字符串时。是的,我想显示string2,但按照charArray的顺序。这就是我面临的问题。感谢您的帮助。 - Foyzul Karim

0

你的代码将会引发一个IndexOutOfBound异常。 当u=0时,charArray[u-1]=-1。


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