Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Русский язык и .NET Добавлено: 21.10.08 01:01  

Автор вопроса:  s12
Проблема вот в чем: читаю данные из текстового файла методом File.OpenRead() и вместо русских букв получаю букозябры. Это че, фича? Как от неё избавиться?
ЗЫ: Речь о VS2008 и простом текстовом файле в кодировке ANSI.

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #1 Добавлено: 21.10.08 01:07
Сразу говорю - использовать StreamReader нельзя.

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 21.10.08 13:22
использовать StreamReader нельзя.

И с чем же связано такое ограничение??

Ответить

Номер ответа: 3
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #3 Добавлено: 21.10.08 16:05
С тараканами в голове у начальника =).
И куском бинарного кода в документе, два раза перечитывать файл не эффективно. Я, конечно, понимаю что дотнет ориентирован на юникод, но классы для конвертации должны быть, в мсдн нет нифига на эту тему...

Ответить

Номер ответа: 4
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #4
Добавлено: 21.10.08 18:40
По умолчанию он в ASCII читает, а не в юникоде. Соответственно все
русские буквы режутся.
Начальника надо однако переучивать. Могу дать на пару дней паяльник.

Ответить

Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 21.10.08 20:20
Ну порадуй тогда своего начальника..

  1.  
  2. using System;
  3. using System.IO;
  4. using System.Text;
  5.  
  6. namespace ConsoleApplication1
  7. {
  8.     public class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             using (FileStream fs = File.OpenRead(@"C:\1.txt"))// ANSI Enoding
  13.             {
  14.                 byte[] buffer = new byte[1024];
  15.                 Encoding encoding = Encoding.GetEncoding(1251); //Encoding.Default;
  16.                 while (fs.Read(buffer, 0, buffer.Length) > 0)
  17.                 {
  18.                     Console.WriteLine(encoding.GetString(buffer));
  19.                 }
  20.             }
  21.             Console.ReadLine(); // wait
  22.         }
  23.     }
  24. }

Ответить

Номер ответа: 6
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #6 Добавлено: 21.10.08 23:51
ВОООТ ОНО!!! Да сразу на шарпе!!! Большой респект!!!

Ответить

Номер ответа: 7
Автор ответа:
 Фенягz



ICQ: 387437448 

Вопросов: 7
Ответов: 202
 Web-сайт: atauenis.narod.ru/
 Профиль | | #7
Добавлено: 22.10.08 15:45
Странно... У меня с VB 2005 всё было Ок. :-/ При чтении из TXT и вывода в TextBox русские буквы были. И при сохранении из TextBox в TXT тоже. С 2008 тоже всё было Ок...

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 22.10.08 18:16
Странно... У меня с VB 2005 всё было Ок.

Ничего странного.. у тебя файл был в UTF-8.. Там с русским текстом все ок(эта кодировка дефолтовая для VS). А ты попробуй создать файл в блокноте и сохрани его в ANSI, а потом попытайся прочитать и увидишь что будет с русским текстом.

Ответить

Номер ответа: 9
Автор ответа:
 Фенягz



ICQ: 387437448 

Вопросов: 7
Ответов: 202
 Web-сайт: atauenis.narod.ru/
 Профиль | | #9
Добавлено: 22.10.08 22:01
Нет. У меня всё было Ок с ANSI, a c Unikode были закорючки.

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 28.10.08 01:16
Ентотр кот спасед РУССКЕХ демогратокоф!

  1. Public Class Convertions
  2.  
  3.  
  4.     Private Shared Encodings As System.Text.Encoding()
  5.     Shared Sub New()
  6.         Encodings = New System.Text.Encoding() { _
  7.             System.Text.Encoding.GetEncoding(1251), _
  8.             System.Text.Encoding.GetEncoding("koi8-R"), _
  9.             System.Text.Encoding.UTF8, _
  10.             System.Text.Encoding.Unicode _
  11.             }
  12.     End Sub
  13.  
  14.     Public Shared Function GetRussianText(ByVal sourceData As Byte()) As String
  15.         Return GetRussianText(sourceData, Nothing)
  16.     End Function
  17.  
  18.     Public Shared Function GetRussianText(ByVal sourceData As Byte(), ByRef Encoding As Text.Encoding) As String
  19.         Dim Counts = New Integer(Encodings.Length - 1) {}
  20.         Dim Texts = New String(Encodings.Length - 1) {}
  21.         For i = 0 To Encodings.Length - 1
  22.             Dim Text = Encodings(i).GetString(sourceData)
  23.             Texts(i) = Text
  24.             Dim Count = 0
  25.             For Each C In Text
  26.                 If C = "а"c OrElse C = "А"c OrElse C = "о" OrElse C = "О" Then
  27.                     Count += 1
  28.                 End If
  29.             Next
  30.             Counts(i) = Count
  31.         Next
  32.  
  33.         Dim Max = Counts.Max
  34.         Dim MaxPos = Array.IndexOf(Counts, Max)
  35.         Encoding = Encodings(MaxPos)
  36.         Return Texts(MaxPos)
  37.     End Function
  38. End Class


Надеюсь не нужно объяснять как работает и как это пользовать?

Ответить

Номер ответа: 11
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 28.10.08 01:22
Кстати ни Павел, ни EROS не правы в своих соображениях :)

По умолчанию StreamReader, если в нем не инициализировать Encoding, пытается сам определить кодировку, используя первые несколько байт.

Таким образом, он может определить UTF8 и Unicode.
То есть - если текст изначально был сохранен в UTF8/Unicode, то он его прочитает, если же там была какая-то другая кодировка, например тот же 1251, он это не сможет определить и будет читать как ANSI, или восточноевропейской (надо проверить) поэтому вместо русских буков будут неверные символы

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам