Java에서 문자열을 UTF8 바이트 배열로 변환하는 방법
Java에서는 String이 있으며 이를 바이트 배열(UTF8 또는 기타 인코딩)로 인코딩합니다.또는 바이트 배열(일부 알려진 인코딩)이 있으며 이를 Java String으로 변환하려고 합니다.이러한 변환은 어떻게 합니까?
String에서 바이트[ ]로 변환합니다.
String s = "some text here";
byte[] b = s.getBytes(StandardCharsets.UTF_8);
바이트[]에서 문자열로 변환:
byte[] b = {(byte) 99, (byte)97, (byte)116};
String s = new String(b, StandardCharsets.US_ASCII);
물론 올바른 인코딩 이름을 사용해야 합니다.이 예에서는 US-ASCII와 UTF-8을 사용하고 있습니다.이것은 가장 일반적인 2개의 인코딩입니다.
다음은 모든 변환에 대해 Charset 조회를 수행하지 않는 솔루션입니다.
import java.nio.charset.Charset;
private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
String decodeUTF8(byte[] bytes) {
return new String(bytes, UTF8_CHARSET);
}
byte[] encodeUTF8(String string) {
return string.getBytes(UTF8_CHARSET);
}
String original = "hello world";
byte[] utf8Bytes = original.getBytes("UTF-8");
String(byte[]), String 생성자 및 getBytes(String) 메서드를 통해 직접 변환할 수 있습니다.Java는 Charset 클래스를 통해 사용 가능한 문자 집합을 표시합니다.JDK 문서에는 지원되는 인코딩 목록이 나와 있습니다.
대부분의 경우 이러한 변환은 스트림에서 수행되므로 Reader/Writer 클래스를 사용합니다.임의의 바이트 스트림에서 String 메서드를 사용하여 증분 디코딩하지 않고 멀티바이트 문자와 관련된 버그에 노출됩니다.
tomcat7 실장에서는 HTTP 요구의 content-type에도 불구하고 문자열을 ISO-8859-1로 받아들이고 있습니다.'é'와 같은 글자를 올바르게 해석하려고 할 때 다음 솔루션이 효과가 있었습니다.
byte[] b1 = szP1.getBytes("ISO-8859-1");
System.out.println(b1.toString());
String szUT8 = new String(b1, "UTF-8");
System.out.println(szUT8);
문자열을 US-ASCII로 해석하려고 했을 때 바이트 정보가 올바르게 해석되지 않았습니다.
b1 = szP1.getBytes("US-ASCII");
System.out.println(b1.toString());
대신 Apache Commons의 StringUtils를 사용할 수 있습니다.
byte[] bytes = {(byte) 1};
String convertedString = StringUtils.newStringUtf8(bytes);
또는
String myString = "example";
byte[] convertedBytes = StringUtils.getBytesUtf8(myString);
표준 문자 집합이 아닌 경우 getBytes를 사용할 수 있습니다.이에 따라 선택 해제() 또는 newString()이 됩니다.
코멘트는 할 수 없지만 새로운 스레드를 시작하고 싶지는 않습니다.근데 이거 안 되네.간단한 왕복:
byte[] b = new byte[]{ 0, 0, 0, -127 }; // 0x00000081
String s = new String(b,StandardCharsets.UTF_8); // UTF8 = 0x0000, 0x0000, 0x0000, 0xfffd
b = s.getBytes(StandardCharsets.UTF_8); // [0, 0, 0, -17, -65, -67] 0x000000efbfbd != 0x00000081
부호화 전과 부호화 후의 배열을 b[]로 해 주세요(이것은 첫 번째 회답입니다).
일련의 바이트를 일반 문자열 메시지로 디코딩하기 위해 UTF-8 인코딩과 함께 사용할 수 있게 되었습니다.
/* Convert a list of UTF-8 numbers to a normal String
* Usefull for decoding a jms message that is delivered as a sequence of bytes instead of plain text
*/
public String convertUtf8NumbersToString(String[] numbers){
int length = numbers.length;
byte[] data = new byte[length];
for(int i = 0; i< length; i++){
data[i] = Byte.parseByte(numbers[i]);
}
return new String(data, Charset.forName("UTF-8"));
}
7비트 ASCII 또는 ISO-8859-1(놀랍게도 일반적인 형식)을 사용하는 경우 새 java.lang을 만들 필요가 없습니다.스트링이 전혀 없어요.단순히 바이트를 char로 캐스트하는 것이 훨씬 더 성능적입니다.
완전한 동작 예:
for (byte b : new byte[] { 43, 45, (byte) 215, (byte) 247 }) {
char c = (char) b;
System.out.print(c);
}
ä, ,, ,, ç, ç 등의 확장 문자를 사용하지 않고, 송신된 값이 최초의 128 Unicode 문자인 것을 확인할 수 있는 경우, 이 코드는 UTF-8 및 확장 ASCII(cp-1252 등)에서도 사용할 수 있습니다.
Charset UTF8_CHARSET = Charset.forName("UTF-8");
String strISO = "{\"name\":\"א\"}";
System.out.println(strISO);
byte[] b = strISO.getBytes();
for (byte c: b) {
System.out.print("[" + c + "]");
}
String str = new String(b, UTF8_CHARSET);
System.out.println(str);
//query is your json
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost("http://my.site/test/v1/product/search?qy=");
StringEntity input = new StringEntity(query, "UTF-8");
input.setContentType("application/json");
postRequest.setEntity(input);
HttpResponse response=response = httpClient.execute(postRequest);
Reader reader = new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(
string.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8));
너무 늦었지만 방금 이 문제에 부딪혔고 이것이 저의 수정 사항입니다.
private static String removeNonUtf8CompliantCharacters( final String inString ) {
if (null == inString ) return null;
byte[] byteArr = inString.getBytes();
for ( int i=0; i < byteArr.length; i++ ) {
byte ch= byteArr[i];
// remove any characters outside the valid UTF-8 range as well as all control characters
// except tabs and new lines
if ( !( (ch > 31 && ch < 253 ) || ch == '\t' || ch == '\n' || ch == '\r') ) {
byteArr[i]=' ';
}
}
return new String( byteArr );
}
언급URL : https://stackoverflow.com/questions/88838/how-to-convert-strings-to-and-from-utf8-byte-arrays-in-java
'sourcecode' 카테고리의 다른 글
스낵바 Vuetify - 시간 초과 후 메서드 재정의 (0) | 2022.08.16 |
---|---|
VueJS 애플리케이션을 통해 Google Analytics 4의 사용자 지정 차원을 전달하려면 어떻게 해야 합니까? (0) | 2022.08.16 |
Vue.js - 요소 UI - POST 요청을 트리거하지 않고 업로드 구성 요소 사용 (0) | 2022.08.15 |
Java 열거형과 공개 정적 최종 필드가 있는 클래스의 장점은 무엇입니까? (0) | 2022.08.15 |
Vuex 작업에 vue-resource를 사용해야 합니까? (0) | 2022.08.15 |