C # UTF-8에서 ISO-8859-1 (Latin1) H로 문자열 변환
이 주제에 대해 검색해 보았고 모든 답변을 살펴 보았지만 여전히 이해하지 못했습니다.
기본적으로 UTF-8 문자열을 ISO-8859-1로 변환해야하며 다음 코드를 사용하여 수행합니다.
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));
내 소스 문자열은
Message = "ÄäÖöÕõÜü"
하지만 불행히도 내 결과 문자열은
msg = "�ä�ö�õ�ü
내가 여기서 뭘 잘못하고 있니?
인코딩 을 대상 인코딩으로 디코딩하기 전에 Encoding.Convert 를 사용 하여 바이트 배열을 조정합니다.
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
string msg = iso.GetString(isoBytes);
문제는 utf8 문자열을 나타내는 바이트가 다른 것으로 해석 될 때 동일한 문자열이된다고 가정한다는 것입니다 (iso-8859-1). 그리고 그것은 단지 사실이 아닙니다. Joel spolsky 의이 훌륭한 기사 를 읽어 보시기 바랍니다.
이 시도:
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8,iso,utfBytes);
string msg = iso.GetString(isoBytes);
먼저 문자열의 소스를 수정해야합니다.
.NET의 문자열은 실제로 16 비트 유니 코드 코드 포인트, 문자의 배열 일 뿐이므로 문자열은 특정 인코딩이 아닙니다.
해당 문자열을 가져 와서 인코딩이 작동하는 바이트 집합으로 변환 할 때입니다.
어쨌든 한 문자 세트로 문자열을 바이트 배열로 인코딩 한 다음 다른 문자 세트로 디코딩하는 방식은 작동하지 않습니다.
원래 문자열의 출처와 인코딩이 잘못되었다고 생각하는 이유에 대해 자세히 설명해 주시겠습니까?
약간 이상한 코드가 보입니다. Utf8 바이트 스트림에서 문자열을 얻으려면 다음을 수행하면됩니다.
string str = Encoding.UTF8.GetString(utf8ByteArray);
iso-8859-1 바이트 스트림을 어딘가에 저장해야하는 경우 다음을 사용하십시오. 이전에 대한 추가 코드 줄 :
byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
Nathan의 솔루션을 사용했으며 제대로 작동합니다. ISO-8859-1을 유니 코드로 변환해야했습니다.
string isocontent = Encoding.GetEncoding("ISO-8859-1").GetString(fileContent, 0, fileContent.Length);
byte[] isobytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(isocontent);
byte[] ubytes = Encoding.Convert(Encoding.GetEncoding("ISO-8859-1"), Encoding.Unicode, isobytes);
return Encoding.Unicode.GetString(ubytes, 0, ubytes.Length);
Encoding targetEncoding = Encoding.GetEncoding(1252);
// Encode a string into an array of bytes.
Byte[] encodedBytes = targetEncoding.GetBytes(utfString);
// Show the encoded byte values.
Console.WriteLine("Encoded bytes: " + BitConverter.ToString(encodedBytes));
// Decode the byte array back to a string.
String decodedString = Encoding.Default.GetString(encodedBytes);
다음은 ISO-8859-9의 샘플입니다.
protected void btnKaydet_Click(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet";
Response.AddHeader("Content-Disposition", "attachment; filename=XXXX.doc");
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-9");
Response.Charset = "ISO-8859-9";
EnableViewState = false;
StringWriter writer = new StringWriter();
HtmlTextWriter html = new HtmlTextWriter(writer);
form1.RenderControl(html);
byte[] bytesInStream = Encoding.GetEncoding("iso-8859-9").GetBytes(writer.ToString());
MemoryStream memoryStream = new MemoryStream(bytesInStream);
string msgBody = "";
string Email = "mail@xxxxxx.org";
SmtpClient client = new SmtpClient("mail.xxxxx.org");
MailMessage message = new MailMessage(Email, "mail@someone.com", "ONLINE APP FORM WITH WORD DOC", msgBody);
Attachment att = new Attachment(memoryStream, "XXXX.doc", "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet");
message.Attachments.Add(att);
message.BodyEncoding = System.Text.Encoding.UTF8;
message.IsBodyHtml = true;
client.Send(message);}
참고URL : https://stackoverflow.com/questions/1922199/c-sharp-convert-string-from-utf-8-to-iso-8859-1-latin1-h
'IT박스' 카테고리의 다른 글
왜 Large Object Heap이고 왜 우리가 관심을 갖는가? (0) | 2020.08.25 |
---|---|
git 브랜치 간 특정 폴더의 차이점 (0) | 2020.08.25 |
다중 레이어 퍼셉트론 (MLP) 아키텍처 : 은닉층 수와 은닉층 크기 선택 기준? (0) | 2020.08.25 |
asp.net webapi 2 요청 및 응답 본문을 데이터베이스에 기록해야합니다. (0) | 2020.08.25 |
SQL에서 복합 기본 키를 어떻게 정의 할 수 있습니까? (0) | 2020.08.25 |