пак за Unicode и UTF8 в .НЕТ

1 отговора 0 прегледа
#1

пак за Unicode и UTF8 в .НЕТ

От време на време се връщам към този проблем.
междувременно се намират по-важни неща, но това продължава да ме тормози и просто не вярвам, че единствения начин е да си напиша собствена имплементация.

Опитвам се със стандартните възможности на .NET да постигна това, което в delphi се прави със стандартните функции utf8Encode() и utf8Decode(), които съответно получават widestring (т.е. unicode string в delphi) и го енкодват в utf8 и обратно - от utf8-енкоднат стринг връщат widestring.

Написах си 2 helper функции със същите имена:

=======================================

using System;
using System.Text;

namespace helpers
{
/// <summary>
/// Description of helper.
/// </summary>
public class Text
{
public static string utf8Encode(string ws) {
byte[] encoded = Encoding.UTF8.GetBytes(ws);

return Encoding.Default.GetString(encoded);
}

public static string utf8Decode(string s) {
byte[] decoded = Encoding.Unicode.GetBytes(s);

return Encoding.Unicode.GetString(decoded);
}
}
}

========================================
Правя следния опит:
1) имам следния текст: "тест test" (т.е. тест на кирилица, после <интервал>, после test на латиница)
2) целта е като направя utf8Encode и после utf8Decode да получа пак същия текст.

Delphi:
---unicode data:---
тест test
codes:
[242][229][241][242][32][116][101][115][116]

извиквам utf8Encode(unicode data):
получавам:
---utf8 data:---
тест test
codes:
[209][130][208][181][209][129][209][130][32][116][101][115][116]

извиквам utf8Decode(utf8 data):
получавам:

---unicode data:---
тест test
codes:
[242][229][241][242][32][116][101][115][116]


C#.NET:
---unicode data:---
тест test
codes:
[242][229][241][242][32][116][101][115][116]

извиквам Text.utf8Encode(unicode data):
получавам:
---utf8 data:---
тест test
codes:
[209][130][208][181][209][129][209][130][32][116][101][115][116]

дотук супер :))
обаче...
извиквам Text.utf8Decode(utf8 data):
получавам:

---unicode data:---
тест test
codes:
[209][130][208][181][209][129][209][130][32][116][101][115][116]


т.е. никакъв ефект
какво ли не пробвах - всички възможни Encoding.
излиза какво ли не, само не и първоначалния текст.

Някой може ли да помогне или да правя хамалогии като се опитам сам да си напиша decode-ването ?
Благодаря предварително

Редактирано от dalguch на

Отговор
в отговор на dalguch #2

Re: пак за Unicode и UTF8 в .НЕТ

Според мен не можеш да трансформираш unicode string в utf8 string поради простата причина че стрингът в .NET е само един - UTF-16.

Това което можеш да направиш е да преобразуваш байтова поредица, която описва utf8 стринг в обект от тип string за да извършваш стрингови операции над него или евентуално да го покажеш:
Encoding.UTF8.GetString()

и също така да преобразуваш обект от тип string в utf8 байтова поредица, която евентуално можеш да запишеш в някакъв файл, ако трябва да се запазва нещо в utf8 формат:
Encoding.UTF8.GetBytes()

Освен това, мисля че не е добрe да се ползва Еncoding.Default освен ако наистина не те интересува какво точно кодиране има определена байтова поредица.

Отговор