面接問題:文字列切り取り
文字列の切り取り
タイトル:javaでは、文字列「abcd」は文字列「abこんにちは」と同じ長さで、4文字です.しかし、対応するバイト数は異なり、1つの漢字が2バイトを占めている.指定したバイト数でサブストリングを取得する方法を定義します.次のようになります.
「abこんにちは」に対して、3バイト取ると、サブストリングはabと「あなた」の字の半分で、半分は捨てなければなりません.4バイトを取ると「abあなた」、5バイトを取るか「abあなた」を取るか.
どう見ても、漢字バイトの扱いに注意していると思います.実際には、異なる符号化フォーマットでは、gbk符号化フォーマットでは漢字が一般的に2バイトを占め、
いずれも0未満で、utf-8では漢字が2バイトを占めているが、負の正である.システムの現在の符号化フォーマットを考慮します.
コード:
タイトル:javaでは、文字列「abcd」は文字列「abこんにちは」と同じ長さで、4文字です.しかし、対応するバイト数は異なり、1つの漢字が2バイトを占めている.指定したバイト数でサブストリングを取得する方法を定義します.次のようになります.
「abこんにちは」に対して、3バイト取ると、サブストリングはabと「あなた」の字の半分で、半分は捨てなければなりません.4バイトを取ると「abあなた」、5バイトを取るか「abあなた」を取るか.
どう見ても、漢字バイトの扱いに注意していると思います.実際には、異なる符号化フォーマットでは、gbk符号化フォーマットでは漢字が一般的に2バイトを占め、
いずれも0未満で、utf-8では漢字が2バイトを占めているが、負の正である.システムの現在の符号化フォーマットを考慮します.
コード:
import java.io.UnsupportedEncodingException;
public class StringCutDemo {
public static void main(String[] args) {
String str="ab c ";// :2 , “ ” :1 1 ( )
byte buf[] = null;
// try {
// //buf = str.getBytes("gbk");
// buf = str.getBytes("utf-8");
//
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// }
buf = str.getBytes();
//
for(byte b:buf){
System.out.print(b+" ");
}
System.out.println();
//
System.out.println(str);
System.out.println("---------------------");
for(int i=0;i<=buf.length;i++){
//String s = cutStringByByteGbk(str,i);// gbk
//String s = cutStringByByteUtf8(str,i);// utf-8 2
// String s = cutStringByByte(str,i);// ,
String s = cutString(str,i);// ,
System.out.println(" "+i+" , :"+s);
}
}
private static String cutString(String str, int len) {
try {
//
String string=System.getProperty("file.encoding");
int a=0;
if(string.equalsIgnoreCase("gbk")){
a=2;
}
if(string.equalsIgnoreCase("utf-8")){
a=3;
}
if(a==0){
return "";
}
byte buf[] = str.getBytes(string);
int count=0;
// len , , “ ”
for(int i=len-1; i>=0; i--){
if(buf[i]<0){
count++;
}else{
break;
}
}
if(count%a==0){// ,
return new String(buf,0,len,string);
}else{// ,
return new String(buf,0,len-count%a,string);
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(" !");
}
}
private static String cutStringByByteGbk(String str, int len) {
try {
//
byte buf[] = str.getBytes("GBK");
int count=0;
// len , , “ ”
for(int i=len-1; i>=0; i--){
if(buf[i]<0){
count++;
}else{
break;
}
}
if(count%2==0){// ,
return new String(buf,0,len,"gbk");
}else{// ,
return new String(buf,0,len-1,"gbk");
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(" !");
}
}
private static String cutStringByByteUtf8(String str, int len) {
try {
//
byte buf[] = str.getBytes("utf-8");
int count=0;
// len , , “ ”
for(int i=len-1; i>=0; i--){
if(buf[i]<0){
count++;
}else{
break;
}
}
if(count%3==0){// 3 ,
return new String(buf,0,len,"utf-8");
}else{// ,
return new String(buf,0,len-count%3,"utf-8");
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(" !");
}
}
public static String cutStringByByte(String str, int len){
if(System.getProperty("file.encoding").equalsIgnoreCase("gbk")){
// System.out.println(System.getProperty("file.encoding"));
return cutStringByByteGbk(str,len);
}
if(System.getProperty("file.encoding").equalsIgnoreCase("utf-8")){
return cutStringByByteUtf8(str,len);
}
return "";
}
}