char [] to Java中用于Unicode字符的字符串序列不匹配

Foy*_*rim 3 java string unicode android char

我有一个类似下面的方法(请忽略代码优化问题.)此方法替换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;
}
Run Code Online (Sandbox Code Playgroud)

在调试时,我得到了charArray的值,如下图所示: 在此输入图像描述
请注意,字符是我想要的顺序格式.
但是在执行语句之后,存储在String变量中的值不匹配.如下: 在此输入图像描述
我想将字符串显示为"রেরেরে",但它显示"েরেরের"我不想要的东西.请告诉我我做错了什么.

Vin*_*lds 6

注意 - 我不知道孟加拉语,但我知道一点(或很多,取决于你问谁)关于Unicode以及Java如何支持它.答案假定知道后者而不是前者.

通过Unicode 6.0孟加拉图表,??是从属元音符号?(0x09C7)和辅音?(0x09B0)的组合,并表示为字符数组中两个字符的序列.

如果你单独得到依赖元音符号,在得到的字符序列中(以及字符串),那么你的优化很可能是怪异的,因为它似乎假设Unicode中的孟加拉语字符可以表示为单个Unicode代码点或charJava中的单个变量; 这将导致辅音被另一个辅音替换的情况,但辅音之前的从属元音永远不会被替换.

因此,我认为正确的优化必须考虑依赖元音的存在,并且除了元音之外还要比较以下辅音,即它必须比较字符数组中的两个字符,而不是比较单个字符.这也可能意味着必须更改方法签名以允许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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,更好的角色替换策略是使用String.replace(CharSequence变体)或String.replaceAll函数,假设您将知道如何将这些与孟加拉语字符一起使用.