Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 10 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 10.07.2006
Откуда: Moscow
Добрый день! Возникла проблема с редактированием текстовых файлов.

Файлы в кодировке UTF-8.

Открываю файл на чтение следующим образом -
StreamReader str;
....
str = File.OpenText("../" + Files[i]);

Открываю файл на Запись
StreamWriter stw;
....
stw = File.CreateText(Files[i]);

(п.с. Не указываю явно кодировку т.к. UTF-8 кодировка по умолчанию, хотя пробовал указывать, не помогло...)

Далее выполняю нехитрые операции: присвоение временной строковой переменной строки из файла на чтение, ее редактирование и запись в файл.

Все вроде неплохо работает, но один символ некорректно отображается в новом файле. А именно символ копирайтов "©". Пробовал вручную тупо копировать его из notepad'а и вставлять явно в программу. Вставка происходит корректно.
Символ видимо съезжает когда я присваиваю строку временной переменной.

string s;
...
s = str.ReadLine();

Сам файл англоязычный. Пробовал запускать программу как под русской так и под английской локалью, разницы не увидел.
На 2005 студии под XP съехавший символ отличается от того что на 2008 студии под Вистой.

Подскажите пожалуйста,
- есть ли надежный способ не повредить содержимое текстового файла?
- можно ли отследить программно, что исходная строка не соответствует той, что неудачно скорирована?



Партнер
 

Member
Статус: Не в сети
Регистрация: 09.01.2006
Откуда: Moscow
Кусок где редактируете строку внимательно смотрите, где-то, возможно, приведение типов срабатывает лишее автоматическое.
Банальное копирование построчно файла в файл ошибок не дает.
Код:
String line;
while ((line = sr.ReadLine()) != null) sw.WriteLine(line);


 

Member
Статус: Не в сети
Регистрация: 10.07.2006
Откуда: Moscow
Упростил программу на подручной 2003ей студии

using System;
using System.IO;
using System.Text;

class temp
{
public static void Main()
{
StreamReader str;
StreamWriter stw;
str = File.OpenText("temp.txt");
stw = File.CreateText("copy.txt");

string s;
for (; ; )
{
s = str.ReadLine();
if (s == null)
break;
stw.WriteLine(s);
}
str.Close();
stw.Close();
}
}

Подсунул файл (temp.txt) с единственной строкой -
<META name="Author" content="© ****** - All rights reserved">

Получил файл (copy.txt) с содержимым -
<META name="Author" content=" ****** - All rights reserved">

Запустил в пошаговом режиме в момент присвоения значения переменная s получает значение
"<META name=\"Author\" content=\" ****** - All rights reserved\">"


 

Member
Статус: Не в сети
Регистрация: 09.01.2006
Откуда: Moscow
Этот код в VS 2k5 работает верно, © никуда не теряется. Что у вас с локалями?


 

Member
Статус: Не в сети
Регистрация: 10.07.2006
Откуда: Moscow
NullPointer писал(а):
Этот код в VS 2k5 работает верно, © никуда не теряется. Что у вас с локалями?


Локаль в данный момент английская.


 

Member
Статус: Не в сети
Регистрация: 09.01.2006
Откуда: Moscow
Давайте temp.txt и copy.txt посмотрим...


 

Member
Статус: Не в сети
Регистрация: 10.07.2006
Откуда: Moscow
Цитата:
Давайте temp.txt и copy.txt посмотрим...

http://www.rapidshare.ru/753669


 

Member
Статус: Не в сети
Регистрация: 09.01.2006
Откуда: Moscow
У вас в исходном файле сам символ закодирован неверно, потому он и уничтожается при попытке раскодировать его (string не при чем, оно уничтожается еще на стадии раскодирования строки из utf8 в unicode).
Создайте файл самым обычным блокнотом (WinXP) и сохраните как utf8, либо прям из софтины создайте файл с этой строкой и посмотрите отличия...

--

Короче, это вообще не UTF8. Это чистый ANSI.


 

Member
Статус: Не в сети
Регистрация: 10.07.2006
Откуда: Moscow
NullPointer писал(а):
У вас в исходном файле сам символ закодирован неверно, потому он и уничтожается при попытке раскодировать его (string не при чем, оно уничтожается еще на стадии раскодирования строки из utf8 в unicode).
Создайте файл самым обычным блокнотом (WinXP) и сохраните как utf8, либо прям из софтины создайте файл с этой строкой и посмотрите отличия...


Ясно. Спасибо.
Но проблема еще в том, что файлы уже есть и в них надо делать замены текста без потери символов. Если исправлять вручную отдельные символы, то теряется весь смысл программы.
И остается вопрос, как программно отследить что строка считана некорректно (что кодировка не соответствует той в которой происходит работа с файлом)?
(вариант отдельным построчным сравнением каждой строки в исходном и измененном файле не греет)


 

Member
Статус: Не в сети
Регистрация: 09.01.2006
Откуда: Moscow
Выставить локаль системную такую же как там где созданы файлы, и работать с исходным файлом указав Encoding.ASCII. Сконвертить, если нужно, через Encoding::Convert...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 10 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan