Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема отображения русских символов


Автор: alir 19.3.2005, 01:20
Процесс такой:

1)содержимое textBox записывается в char массив ,
2)далее он преобразуется в byte массив, который передается по сети
3)после принятия из сетевого потока эти данные у клиента записываются в свой byte массив
4)потом этот полученный массив преобразуется обратно в char и передается в объект StringBuilder
5)далее этот объект преобразуется в string и выводится в textArea

но проблема такая - почему-то русские буквы передаются некорректно (т.е. в конце получаем какие-то левые символы), а вот английские буквы передаются нормально!

помогите плз!!! Подскажите в чем проблема и как ее решить!


Автор: Domestic Cat 19.3.2005, 01:26
Строки в .НЕТ - UTF-16 / UTF-8, а байт может держать только 255 символов smile

Автор: alir 19.3.2005, 13:31
Согласен! Но как решить данную проблему?

Автор: Sardar 19.3.2005, 14:59
Цитата(Domestic @ 19.3.2005, 00:26)
Строки в .НЕТ - UTF-16 / UTF-8, а байт может держать только 255 символов

Дык всё равно это юникод, просто в UTF-8 под русские символы с флагом второго байта 2 байта на символ отсылаются. Другое дело если при отправке не к UTF-8 текст приводится, то в зависимости от кодировки текст и будет бится...

А нельзя ли самому к UTF-8 закодировать, получить байтовый массив, а затем его отправить?

Автор: Ch0bits 19.3.2005, 17:14
У меня аналогичная проблема: smile

private void button1_Click(object sender, System.EventArgs e)
{
StreamReader sr=File.OpenText(@"c:\IN.txt");
StreamWriter sw=File.CreateText(@"c:\OUT.txt");
string input;
while ((input=sr.ReadLine())!=null)
{
richTextBox1.AppendText(input);
sw.WriteLine(input);
}
sw.Close();
sr.Close();
}

IN.TXT юникод или винд. кодировка
OUT.TXT записывается "ероглифы", кодировка не определяется. smile
в richTextBox всё показывается правильно smile

Как нормально выводить русские буквы в OUT.TXT??? smile

P.S. Как в посте сделать, чтобы не убирались пробелы в начале строк?

Автор: Domestic Cat 19.3.2005, 21:21
Код

using System;
using System.Text;
class Hello {
    public static void Main() {
        Byte[] bytes;
        String str = "Привет";
        
        UTF8Encoding utf8 = new UTF8Encoding();
        
        bytes = utf8.GetBytes(str);
        
        Console.WriteLine(
            "{0} bytes used to encode string.", bytes.Length
        );
        Console.Write("Encoded bytes: ");
        foreach (Byte b in bytes) {
            Console.Write("[{0}]", b);
        }
        Console.WriteLine("\nDecoding");
        Char[] chars = utf8.GetChars(bytes);
        foreach (Char c in chars) {
            Console.Write(c);
        }
    }
}

Автор: Kurt 20.3.2005, 01:19
Vadim999
Твой код нормально работает, если исходный файл был в формате Unicode (специально проверил).
С "не-Unicode" твой код работать не сможет. Прочитай про методы CreateText() и OpenText().
Там сказано:
Цитата
Opens an existing UTF-8 encoded text file for reading.

(это для OpenText)
Т.е. при использовании этих методов подразумевается UTF-8.
Для других кодировок, думаю, следует работать с массивами байтов, как показал Domestic Cat



М
 
Vadim999. Пожалуйста, пользуйся тегом CODE!

Автор: Ch0bits 20.3.2005, 15:50
Ааа! Теперь всё ясно! smile Как дядя Билли назихерил. smile Спасибки!

Автор: alir 23.3.2005, 23:12
Ура! Я нашел решение!
Дело в том, что по умолчанию стоит кодировка UTF-8 - отсюда и некорректность передачи русских символов. Т.е. надо было использовать кодировку Unicode. Делается так:
Код

//считываем из текстовой области
string s = textBox1.Text.ToString();
//объявление кодировки
Encoding enc = System.Text.Encoding.Unicode;
//запихиваем в byte массив
dataToSend = enc.GetBytes(s);


Далее (в моем случае это отправка byte массива по сетевому потоку)
на месте декодируем:
Код

//еще раз объявлем, уже в другом файле
Encoding enc = System.Text.Encoding.Unicode;
//считываем в string-переменную
string decS = enc.GetString(msg2);
//кидаем на компонент
textBox2.Text = decS;


Вот и все!

Автор: Domestic Cat 23.3.2005, 23:18
А ты мой пример пробовал запускать?
Просто дело в том, что UTF-8 и есть Unicode...

Автор: Kurt 24.3.2005, 00:32
Цитата
Просто дело в том, что UTF-8 и есть Unicode...


smile
Точно? Вот выдержки из MSDN.
Описание класса UnicodeEncoding:
Цитата
Represents a UTF-16 encoding of Unicode characters.


А вот UTF8Encoding:
Цитата
Represents a UTF-8 encoding of Unicode characters.


smile

Автор: Domestic Cat 24.3.2005, 01:35
Цитата(Kurt @ 23.3.2005, 15:32)
Точно? Вот выдержки из MSDN.
Описание класса UnicodeEncoding:


Да видишь ли... UTF расшифровывается как Unicode Transformation Format... smile То есть формат для Unicode.

Автор: alir 24.3.2005, 15:42
Цитата
Да видишь ли... UTF расшифровывается как Unicode Transformation Format...  То есть формат для Unicode.


Вообще да, но все-таки они отличаются! Нужна была именно кодировка Unicode, а не UTF-8!

Автор: Domestic Cat 24.3.2005, 19:13
Цитата
Нужна была именно кодировка Unicode, а не UTF-8!


Неужтo UTF-8 как-то нe так русские буквы передает ?? smile

Автор: alir 24.3.2005, 19:24
Цитата
Неужтo UTF-8 как-то нe так русские буквы передает ??

Ну сам проверял! UTF-8 стоит по умолчанию - кодирует некорректно,
ставишь Unicode - все работает! Там все дело в количестве байтов символов.

Автор: Domestic Cat 24.3.2005, 19:28
Цитата
Ну сам проверял! UTF-8 стоит по умолчанию - кодирует некорректно,
ставишь Unicode - все работает! Там все дело в количестве байтов символов.


Ты мой код запускал? Правильно он передает или нет?

Автор: alir 24.3.2005, 19:35
Цитата
Ты мой код запускал? Правильно он передает или нет?

Твой код не запускал. До своего додумался. Главное есть результат.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)