用字符串替换字符的最佳方法是什么:例如:
在我的情况下,我有一个包含拉丁文字符和符号的字符串我用intermec打印机打印它。我必须使用以下打印机传递字符的代码ASCII 说明:
instruction CHR$(<dec. ascii value>)
示例: 此文字: N°Box 将按如下方式进行转换:
"N\""+";CHR$(179); \""+"Box"
我写了这个:
if (!isValid(str)) {
Map charsAsciiCode = new HashMap();
for (int i = 0; i < str.length(); i++) {
String c = String.valueOf(str.charAt(i));
if (specialCharsMap.containsKey(c)) {
String decimalString = (String) specialCharsMap.get(c);
charsAsciiCode.put(new Integer(i), " \";CHR$(" + decimalString + ");\"");
}
}
Iterator iter = charsAsciiCode.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry mapEntry = (Map.Entry) iter.next();
int charIndex = (int) mapEntry.getKey();
String charAscii = (String) mapEntry.getValue();
// Here i want to replace every char with the correspondant Ascii value
}
}
static boolean isValid(String input) {
Matcher m = p.matcher(input);
return m.matches();
}
final static Pattern p = Pattern.compile("\\p{Alpha}+");
private static Map specialCharsMap = new HashMap();
static {
specialCharsMap.put("é", "123");
specialCharsMap.put("è", "125");
specialCharsMap.put("à", "64");
specialCharsMap.put("ç", "92");
specialCharsMap.put("^", "94");
specialCharsMap.put("'", "39");
}
答案 0 :(得分:1)
至少有两种天真的方法可以解决这个问题:
replaceAll
醇>
这两个实现:
String replaceCharsByRebuilding(String str, Map<Character, String> mapping) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < str.length(); ++i) {
char c = str.charAt(i);
String replacement = mapping.get(c);
builder.append(replacement == null ? c : replacement);
}
return builder.toString();
}
String replaceCharsByReplaceAll(String str, Map<Character, String> mapping) {
for (Map.Entry<Character, String> entry : mapping.entrySet()) {
str = str.replaceAll(entry.getKey().toString(), entry.getValue());
}
return str;
}
两者都应该给出相同的结果,但我认为第一个应该更好。
答案 1 :(得分:1)
您不需要Map
,因为您可以这样做:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i = i+1) {
char ch = str.charAt(i);
if (ch > 127) {
// TODO: generate all the \\""+; crap around CHR$()
sb.append(String.format("CHR$(%d)", (int)ch));
}
else
sb.append ch;
}
答案 2 :(得分:1)
在函数printerString
下面,将普通字符串转换为打印机编码中的字符串。
static final Map<Character, Character> specialCharsMap = new HashMap<>();
static {
specialCharsMap.put('é', (char)123);
specialCharsMap.put('è', (char)125);
specialCharsMap.put('à', (char)64);
specialCharsMap.put('ç', (char)92);
specialCharsMap.put('^', (char)94);
specialCharsMap.put('\'', (char)39);
}
static String printerString(String s) {
StringBuilder sb = new StringBuilder(s.length());
for (int i = 0; i < s.length(); ++i) {
char ch = s.charAt(i);
Character specialCh = specialChars.get(ch);
if (specialCh != null) {
ch = specialCh;
}
sb.append(ch);
}
return sb.toString();
}
首先,CHR$(123)
是将ASCII 123转换为String(一个字符)的基本编程语言函数调用。我们可以通过用等效的打印机编码字符替换特殊(Unicode)字符来实现同样的目的。
对于java初学者:它依赖于自动装箱 - 将char(基本类型)转换为Character(对象包装器)。