VB에서 C #으로 무언가를 변환하고 있습니다. 이 문장의 구문에 문제가 있습니다 :
if ((searchResult.Properties["user"].Count > 0))
{
profile.User = System.Text.Encoding.UTF8.GetString(searchResult.Properties["user"][0]);
}
그런 다음 다음 오류가 표시됩니다.
인수 1 : ‘object’에서 ‘byte []’로 변환 할 수 없습니다
‘System.Text.Encoding.GetString (byte [])’에 대해 가장 오버로드 된 메소드 일치에 올바르지 않은 인수가 있습니다.
이 게시물을 기반으로 코드를 수정하려고 했지만 여전히 성공하지 못했습니다.
string User = Encoding.UTF8.GetString("user", 0);
어떤 제안?
답변
바이트 배열이 이미 있으면 해당 바이트 배열로 인코딩하는 데 사용 된 인코딩 유형을 알아야합니다.
예를 들어, 바이트 배열이 다음과 같이 생성 된 경우 :
byte[] bytes = Encoding.ASCII.GetBytes(someString);
다음과 같이 문자열로 다시 설정해야합니다.
string someString = Encoding.ASCII.GetString(bytes);
상속 한 코드에서 바이트 배열을 만드는 데 사용 된 인코딩을 찾으면 설정해야합니다.
답변
먼저 System.Text
네임 스페이스를 추가하십시오.
using System.Text;
그런 다음이 코드를 사용하십시오.
string input = "some text";
byte[] array = Encoding.ASCII.GetBytes(input);
그것을 고치기를 바랍니다!
답변
또한 확장 메소드 를 사용하여 string
다음과 같이 유형에 메소드 를 추가 할 수 있습니다 .
static class Helper
{
public static byte[] ToByteArray(this string str)
{
return System.Text.Encoding.ASCII.GetBytes(str);
}
}
그리고 아래와 같이 사용하십시오 :
string foo = "bla bla";
byte[] result = foo.ToByteArray();
답변
var result = System.Text.Encoding.Unicode.GetBytes(text);
답변
static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
static string GetString(byte[] bytes)
{
char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
return new string(chars);
}
답변
Encoding.Default를 사용하지 않아야하는 이유 …
@Randall의 답변은을 사용 Encoding.Default
하지만 Microsoft 는 이에 대한 경고를 표시합니다 .
컴퓨터마다 다른 인코딩을 기본값으로 사용할 수 있으며 기본 인코딩은 단일 컴퓨터에서 변경 될 수 있습니다. 기본 인코딩을 사용하여 컴퓨터간에 스트리밍되거나 동일한 컴퓨터에서 다른 시간에 검색된 데이터를 인코딩 및 디코딩하면 해당 데이터가 잘못 변환 될 수 있습니다. 또한 Default 속성에서 반환 된 인코딩은 가장 적합한 대체를 사용하여 지원되지 않는 문자를 코드 페이지에서 지원하는 문자로 매핑합니다. 이러한 이유로 기본 인코딩을 사용하지 않는 것이 좋습니다. 인코딩 된 바이트가 올바르게 디코딩되도록하려면 UTF8Encoding 또는 UnicodeEncoding과 같은 유니 코드 인코딩을 사용해야합니다. 또한 더 높은 수준의 프로토콜을 사용하여 인코딩 및 디코딩에 동일한 형식이 사용되도록 할 수 있습니다.
기본 인코딩이 무엇인지 확인하려면 Encoding.Default.WindowsCodePage
(내 경우에는 1250을 사용하십시오. 슬프게도 사전 정의 된 CP1250 인코딩 클래스는 없지만 객체는로 검색 할 수 있습니다 Encoding.GetEncoding(1250)
)를 사용하십시오.
Encoding.ASCII
7bit이므로 내 경우에는 작동하지 않습니다.
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
… 그리고 UTF-8 인코딩을 대신 사용해야하는 이유 …
기본 인코딩은 오해의 소지가 있습니다. .NET은 모든 곳에서 UTF-8을 실제 기본값으로 사용합니다 (20 비트 말에 8 비트 인코딩은 더 이상 사용되지 않습니다. 세기를 확인하십시오 Console.OutputEncoding.EncodingName
). 따라서 코드에서 정의한 모든 상수는 기본적으로 UTF-8로 인코딩됩니다. 이것은 데이터 소스가 다른 인코딩이 아닌 한 사용해야합니다.
* 이것은 직접 거짓말 인 내 경우에는 UTF-8입니다 chcp
.Windows 콘솔 (cmd)에서 852가 반환되며 현지화 된 시스템 명령 (ping과 같은) 은이 코드 페이지에 하드 코드가 있으므로 변경해서는 안됩니다
Microsoft의 권장 사항에 따라 :
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
UTF-8 인코딩 인스턴스는 다른 사람이 권장하며 직접 또는 다음과 같이 사용할 수도 있습니다.
var utf8 = Encoding.UTF8 as UTF8Encoding;
… 항상 사용되는 것은 아닙니다
바이트 배열의 인코딩은 서방 국가에서는 유니 코드에서 “작동”해야하지만 동유럽에서와 같이 지원되지 않는 일부 지역으로 프로그램을 이동하자마자 정말 엉망입니다. 체코 어에서는 Windows 기본값을 사용합니다. (2020 년!) 콘솔 용 MS 비표준 852 (일명 Latin-2), Windows OEM으로서 1250, .NET (및 기타)으로서 UTF-8 (65001) 새로운 기본값이며 일부 서부 유럽 8 비트를 명심해야합니다. 데이터는 여전히 1252 년이지만 동유럽의 기존 8 비트 서부 표준은 ISO-8859-2 (일명 라틴 -2이지만 852와 같은 라틴 -2는 아님)입니다. ASCII를 사용한다는 것은 두부와 ‘?’로 가득 찬 텍스트를 의미합니다. 여기. 따라서 21 세기 반까지 UTF-8을 명시 적으로 설정하십시오 .
답변
오프 구축 알리의 대답은 , 당신이 선택적으로 사용할 인코딩을 전달 할 수있는 확장 방법을 추천 할 것입니다 :
using System.Text;
public static class StringExtensions
{
/// <summary>
/// Creates a byte array from the string, using the
/// System.Text.Encoding.Default encoding unless another is specified.
/// </summary>
public static byte[] ToByteArray(this string str, Encoding encoding = Encoding.Default)
{
return encoding.GetBytes(str);
}
}
그리고 아래와 같이 사용하십시오 :
string foo = "bla bla";
// default encoding
byte[] default = foo.ToByteArray();
// custom encoding
byte[] unicode = foo.ToByteArray(Encoding.Unicode);