는 내가 비 유니 코드 응용 프로그램입니다 일부 고객 데이터 시스템과 인터페이스 할 .NET Framework의 유니 코드 인코딩 작업을 할 때 나를 방해 뭔가에 관한 당신의 도움이 ...C#을 유니 코드
필요하고, 그 고객은 전세계 회사 (중국어, 한국어, 러시아어, ...)를 보유하고 있습니다. 따라서 그들은 ASCII 8 비트 파일을 제공해야하며,이 파일은 Windows 코드 페이지로 인코딩됩니다.
그리스 고객이 제품 이름에 'Σ'(시그마 문자 '\ u03A3')이 포함 된 텍스트 파일을 보내면 211 ANSI 코드 포인트에 해당하는 문자를 직접 구할 수 있습니다. 코드 페이지. 내 컴퓨터는 프랑스어 Windows입니다. 즉, 코드 페이지가 Windows-1252이므로이 텍스트 파일에 'Ó'가 표시됩니다. Ok.
나는이 고객이 그리스어 인 것을 알고 있으므로 수입 매개 변수에서 windows-1253 코드 페이지를 강제로 읽음으로써 그의 파일을 읽을 수 있습니다.
/// <summary>
/// Convert a string ASCII value using code page encoding to Unicode encoding
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string ToUnicode(string value, int codePage)
{
Encoding windows = Encoding.Default;
Encoding unicode = Encoding.Unicode;
Encoding sp = Encoding.GetEncoding(codePage);
if (sp != null && !String.IsNullOrEmpty(value))
{
// First get bytes in windows encoding
byte[] wbytes = windows.GetBytes(value);
// Check if CodePage to use is different from current Windows one
if (windows.CodePage != sp.CodePage)
{
// Convert to Unicode using SP code page
byte[] ubytes = Encoding.Convert(sp, unicode, wbytes);
return unicode.GetString(ubytes);
}
else
{
// Directly convert to Unicode using windows code page
byte[] ubytes = Encoding.Convert(windows, unicode, wbytes);
return unicode.GetString(ubytes);
}
}
else
{
return value;
}
}
결국 내 응용 프로그램에 'Σ'가 있는데 내 SQL Server 데이터베이스에 저장할 수 있습니다. 이제 내 응용 프로그램은 몇 가지 복잡한 계산을 수행해야하며 자동 내보내기를 통해이 파일을 고객에게 돌려 주어야합니다. ...
그래서 문제는 UNICODE => ANSI 변환을 수행해야한다는 것입니다. 하지만 이것은 처음에 생각했던 것처럼 간단하지 않습니다 ...
저는 첫 번째 아이디어가 UNICODE를 windows-1252로 변환 한 다음 자동으로 보내고 싶었습니다. 고객에게 파일. 그들은 자신의 코드 페이지로 내 보낸 텍스트 파일을 읽을 것이므로이 아이디어는 저에게 흥미로울 것입니다.
그러나 문제는 ... 여기 두 가지 예입니다 이런 식으로 변환이 이상한 행동을 가지고 있다는 것입니다 :
1 예 (я)
char ya = '\u042F';
string strYa = Char.ConvertFromUtf32(ya);
System.Text.Encoding unicode = System.Text.Encoding.Unicode;
System.Text.Encoding ansi1252 = System.Text.Encoding.GetEncoding(1252);
System.Text.Encoding ansi1251 = System.Text.Encoding.GetEncoding(1251);
string strYa1252 = ansi1252.GetString(System.Text.Encoding.Convert(unicode, ansi1252, unicode.GetBytes(strYa)));
string strYa1251 = ansi1251.GetString(System.Text.Encoding.Convert(unicode, ansi1251, unicode.GetBytes(strYa)));
그래서 strYa1252에 포함 된 '가 ? '이고, strYa1251에는 유효한 문자'я '이 포함되어 있습니다. 그래서 그것은 가능한 코드가 Convert() 함수에 지정되지 않으면 ANSI로 변환 할 수 없습니다. 유니 코드 인코딩 클래스에서는 ANSI와 UNICODE 코드 포인트 사이의 동등성을 얻을 수 없습니다. : \
2 예 (Σ)이 때
char sigma = '\u3A3';
string strSigma = Char.ConvertFromUtf32(sigma);
System.Text.Encoding unicode = System.Text.Encoding.Unicode;
System.Text.Encoding ansi1252 = System.Text.Encoding.GetEncoding(1252);
System.Text.Encoding ansi1253 = System.Text.Encoding.GetEncoding(1253);
string strSigma1252 = ansi1252.GetString(System.Text.Encoding.Convert(unicode, ansi1252, unicode.GetBytes(strSigma)));
string strSigma1253 = ansi1253.GetString(System.Text.Encoding.Convert(unicode, ansi1253, unicode.GetBytes(strSigma)));
, 나는 올바른가 strSigma1253 문자열에서 'Σ', 그러나 나는 또한 strSigma1252 에 대한 'S'을 가지고있다. ANSI 코드가 발견되면 처음에 표시된 바와 같이, 나는 'Ó'또는 '?' 캐릭터는 발견되지 않았지만 'S'는 발견되지 않았다. 왜? 물론 언어학자는 'S'는 그리스 문자 시그마 문자와 동일하다고 말할 수 있습니다. 왜냐하면 두 알파벳에서 동일하게 들리지만 동일한 ANSI 코드가 없기 때문입니다!
그래서 .NET Framework의 Convert() 함수가 이러한 종류의 동등성을 관리 할 수 있습니까?
그리고 누군가가 UNICODE에서 ANSI 문자를 고객에게 보내야하는 텍스트 파일로 다시 쓸 생각이 있습니까?
당신은 정말 고객의 코드 페이지를 알아야 할 . 해당 정보가 없으면이를 수행 할 수 없습니다. –
예를 들어 windows-1252 코드 페이지와 관련된 MSDN (http://msdn.microsoft.com/en-us/goglobal/cc305145.aspx)을 살펴보면이 페이지의 맨 아래에 ANSI 1252 코드 및 유니 코드 코드 포인트 .... 그래서 유니 코드에서 하나 이상의 ANSI 코드 페이지로 갈 때 동등한 생각이 들었습니다. 예제는 http://www.fileformat.info/info/unicode/char/3a3/charset_support.htm입니다. 여기에는 모든 Windows 코드 페이지에 대해 sigma에 해당하는 모든 코드가 있습니다 ... – alex
고객에게 일하게하는 것이 더 나을 수도 있습니다 UTF-8 또는 유니 코드 자체 당신도 그들이 사용하는 소프트웨어를 통제합니까? – Rup