我收到了来自IBM Mainframe的字符串,如下所示(2字节图形字体)
“; A; B; C; D; E; F; G; H; I; J; K; L; M; N; O; P; Q; R; S; T; U; V; W ; X; Y; Z; A; b; C; d,E,F;克; H; I;焦耳; k;升;米; N;○,p,q,R; S;吨; U; v ; W; X; Y; Z; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9;`; - ;!=;₩;〜; @;#; $;%; ^ ;&; *;(;); _ +; |; [;]; {;};:;“。?';;; /; <;>;”;
并且,我想将这些字符更改为1字节ascii代码
如何使用java中的java.util.regex.Matcher,String.replaceAll()来替换它们
目标字符:
; A; B; C; d,E,F; G; H; I;Ĵ; k,L; M; N; O; P:Q; R等S;吨; U; V;瓦; X; Y; Z; A; b; C; d,E,F;克; H; I;焦耳; k;升;米; N;○,p,q,R; S;吨; U; v;瓦特; X; Y; Z; 0; 1; 2; 3; 4; 5; 6; 7; 8; 9;`; - ;!=; \;〜; @;#; $;%; ^; &安培;; *;(;); _ +; |; [;]; {;};:; “?';;; /;&LT ;;取代;;”;
答案 0 :(得分:2)
这不是(正如其他响应者所说的)字符编码问题,但正则表达式仍然是错误的工具。如果Java有相当于Perl的tr///
运算符, 将是正确的工具,但您可以轻松地手动编写代码:
public static String convert(String oldString)
{
String oldChars = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`-=₩~!@#$%^&*()_+|[]{}:"',./<>?";
String newChars = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`-=\\~!@#$%^&*()_+|[]{}:\"',./<>?";
StringBuilder sb = new StringBuilder();
int len = oldString.length();
for (int i = 0; i < len; i++)
{
char ch = oldString.charAt(i);
int pos = oldChars.indexOf(ch);
sb.append(pos < 0 ? ch : newChars.charAt(pos));
}
return sb.toString();
}
我假设第一个字符串中的每个字符对应于第二个字符串中相同位置的字符,并且第一个字符(U+3000
,'IDEOGRAPHIC SPACE')应该转换为ASCII空格(U+0020
)。
确保将源文件保存为UTF-8,并在编译时包含-encoding UTF-8
选项(或告诉IDE这样做)。
答案 1 :(得分:0)
不要认为这是关于正则表达式的,而是关于编码。应该可以读入2字节的字符串,然后用任何其他编码写入。 查看here以获取支持的编码。