jis”字符串

wydwbb8l  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(461)

问题陈述:-
我们叫0x8140~0x84be,0x889f~0x9872,0x范围为989f~0x9ffc、0xe040~0xeaa4、0x8740~0x879c、0xed40~0xeefc、0xfa40~0xfc4b、0xf040~0xf9fc。
我想验证输入字符串是否包含不在上述范围内的汉字。
以下是不在上述范围内的输入汉字和输出结果的示例:-
龔 --> 好 啊
鑫 --> 好 啊
璐 --> 需要改变吗
预期结果应该是所有人都“需要改变”。请帮忙。
以下是代码:-

import java.io.UnsupportedEncodingException;
import java.util.regex.*;
//import java.util.regex.Pattern;

public class RegExpDemo2 {

    private boolean validateMnpName(String name)  {

        try {
            byte[] utf8Bytes = name.getBytes("UTF-8");
            String string = new String(utf8Bytes, "UTF-8");

            byte[] shiftJisBytes = string.getBytes("Shift-JIS");
            String strName = new String(shiftJisBytes, "Shift-JIS");

            System.out.println("ShiftJIS Str name : "+strName);

            final String regex = "([\\x{8140}-\\x{84BE}]+)|([\\x{889F}-\\x{9872}]+)|([\\x{989F}-\\x{9FFC}]+)|([\\x{E040}-\\x{EAA4}]+)|([\\x{8740}-\\x{879C}]+)|([\\x{ED40}-\\x{EEFC}]+)|([\\x{FA40}-\\x{FC4B}]+)|([\\x{F040}-\\x{F9FC}]+)";

            if (Pattern.compile(regex).matcher(strName).find()) {
                return true;
            } else
                return false;
        }
        catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    public static void main(String args[]) {

        RegExpDemo2 obj = new RegExpDemo2();

        if (obj.validateMnpName("ロ")) {
            System.out.println("OK");
        } else {
            System.out.println("Need Change");
        }

    }
}
gkn4icbw

gkn4icbw1#

您的方法无法工作,因为字符串在java中是unicode。
正如@vgr和我所观察到的,通过shift-jis字节数组的往返不会改变这一点。您只需将unicode转换为shift-jis,然后再转换回unicode。
有两种可能的方法:
将java字符串(unicode)转换为字节数组(shift-jis编码),然后检查字节数组中允许/禁止的值。
将“允许的”范围转换为unicode(shift-jis中的单个范围可能不是unicode中的单个范围),并使用unicode中的字符串表示。
这两种方法看起来都不太好,但如果您必须使用旧的字符代码,而不是不太旧的(只有30年!)unicode,这是必要的。

相关问题