Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# и RTF вопрос / 25 сообщений из 34, страница 1 из 2
18.03.2014, 14:33
    #38589482
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Есть у меня c# функция, которая вынимает из RTF чистый текст.

Есть такой текст в RTF

The ü, ö, ç characters are displayed as ь, ц, з, "ш", "щ", "ы"


Вот его внутренности

{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset0 Arial;}}
{\colortbl ;\red0\green0\blue0;}
\viewkind4\uc1\pard\cf1\fs24\par
The \ldblquote\'fc\rdblquote , \ldblquote\'f6\rdblquote , \ldblquote\'e7\rdblquote characters are displayed as \ldblquoteᄀ?\rdblquote , \ldblquote႔?\rdblquote , \ldblquoteၹ?\rdblquote , "႖?", "႗?", "႙?"\par
}


Вопрос:
Меняю пальцами ansicpg1251 на ansicpg1252 или ansicpg1253 но контрол в с++ показывает корректно текст, т.е. турецкие, русские буквы - все ок.
Как понять это параметр ansicpg1251 ? он игнорируется полностью?

Но если я регаирую на этот параметр, то естесвтенно вместо турецких символов будут русские или греческие.
...
Рейтинг: 0 / 0
18.03.2014, 14:53
    #38589515
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh,

..так символы же в Юникоде, если не ошибаюсь .. им пофиг ANSI
...
Рейтинг: 0 / 0
18.03.2014, 14:57
    #38589520
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
carrotikWinnipuh,

..так символы же в Юникоде, если не ошибаюсь .. им пофиг ANSI

Если я правильно понимаю такие "႖?" да, в юникоде, а такие "\'f6" ?

Собственно в них и проблема в данном примере, т.е. как их интепретировать
...
Рейтинг: 0 / 0
18.03.2014, 14:59
    #38589530
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh,

русские - в юникоде - им похер установка codepage

а вот с турецкими - сложнее.
на показ влияет \fcharset

чтоб избавиться от проблем - \ansicpg1251 указывай с \fcharset204
а чтоб наверняка - всё что не ASCII - пиши в юникоде
...
Рейтинг: 0 / 0
18.03.2014, 15:14
    #38589558
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
ИзопропилWinnipuh,

русские - в юникоде - им похер установка codepage

а вот с турецкими - сложнее.
на показ влияет \fcharset

чтоб избавиться от проблем - \ansicpg1251 указывай с \fcharset204
а чтоб наверняка - всё что не ASCII - пиши в юникоде

так проблема в том, что ртф пишется ms контролом в c++ приложении.
Я туда не влезу.

А у меня c# функция, которая читает ртф и выдает на выходе чистый текст.
Вот она и срабатывает неправильно, т.е. реагирует по-честному на параметр ansicpg1251 или ansicpg1254
и в зависимости от него показывает то русские, то греческие символы и т.д..

а контрол игнорирует его и всегда показывает турецкие символы.

Вопрос в том, когда этот параметр мне можно игнорировать в c#?
...
Рейтинг: 0 / 0
18.03.2014, 16:26
    #38589698
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuhа контрол игнорирует его и всегда показывает турецкие символы.
потому что \fcharset0


на выходе "ms контролом в c++ приложении" - кривой rtf,
что здесь удивительного ?
поправь \fcharset
...
Рейтинг: 0 / 0
18.03.2014, 16:29
    #38589704
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
ИзопропилWinnipuhа контрол игнорирует его и всегда показывает турецкие символы.
потому что \fcharset0


на выходе "ms контролом в c++ приложении" - кривой rtf,
что здесь удивительного ?
поправь \fcharset

так не я его пишу, как его исправлю?
это пишет майкрософтовский ричедит контрол, используемый в с++, но он то сам правильно показывает символы.
Вот я и пытаюсь понять, как мне разбирать такой ртф.
...
Рейтинг: 0 / 0
18.03.2014, 16:29
    #38589705
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh,

...да перепишите в своей функции словарь (под набор 1251) просто вручную ... туповато, конечно, но у меня так вб-скрипт работает, который ртф-ки парсит
...
Рейтинг: 0 / 0
18.03.2014, 16:33
    #38589709
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh,

...или просто replace сделайте fcharset0 на fcharset204, прежде чем на вход функции подавать ...
...
Рейтинг: 0 / 0
18.03.2014, 17:09
    #38589767
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
carrotikWinnipuh,

...или просто replace сделайте fcharset0 на fcharset204, прежде чем на вход функции подавать ...

сделал, не помогло.
Функция кстати не отображает, а разбирает ртф и вынимает текст.
...
Рейтинг: 0 / 0
18.03.2014, 17:15
    #38589776
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
WinnipuhcarrotikWinnipuh,

...или просто replace сделайте fcharset0 на fcharset204, прежде чем на вход функции подавать ...

сделал, не помогло.
Функция кстати не отображает, а разбирает ртф и вынимает текст.

...ну, значит, руками пишите массив и переподставляйте ... вот так у меня в скрипте работает, на VBS ... понятно, что велосипед наколенный, но работает

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Function ConvertHex2Win(strString)
    strHexCharArray = "\'00,\'01,\'02,\'03,\'04,\'05,\'06,\'07,\'08,\'09,\'0a,\'0b," _
    & "\'0c,\'0d,\'0e,\'0f,\'10,\'11,\'12,\'13,\'14,\'15,\'16,\'17,\'18,\'19,\'1a," _
    & "\'1b,\'1c,\'1d,\'1e,\'1f,\'20,\'21,\'22,\'23,\'24,\'25,\'26,\'27,\'28,\'29," _
    & "\'2a,\'2b,\'2c,\'2d,\'2e,\'2f,\'30,\'31,\'32,\'33,\'34,\'35,\'36,\'37,\'38," _
    & "\'39,\'3a,\'3b,\'3c,\'3d,\'3e,\'3f,\'40,\'41,\'42,\'43,\'44,\'45,\'46,\'47," _
    & "\'48,\'49,\'4a,\'4b,\'4c,\'4d,\'4e,\'4f,\'50,\'51,\'52,\'53,\'54,\'55,\'56," _
    & "\'57,\'58,\'59,\'5a,\'5b,\'5c,\'5d,\'5e,\'5f,\'60,\'61,\'62,\'63,\'64,\'65," _
    & "\'66,\'67,\'68,\'69,\'6a,\'6b,\'6c,\'6d,\'6e,\'6f,\'70,\'71,\'72,\'73,\'74," _
    & "\'75,\'76,\'77,\'78,\'79,\'7a,\'7b,\'7c,\'7d,\'7e,\'7f," _
    & "\'80,\'81,\'82,\'83,\'84,\'85,\'86,\'87,\'88,\'89,\'8A,\'8B,\'8C,\'8D,\'8E,\'8F,\'90," _
    & "\'91,\'92,\'93,\'94,\'95,\'96,\'97,\'98,\'99,\'9A,\'9B'9C,\'9D,\'9E,\'9F," _
    & "\'A0,\'A1,\'A2,\'A3,\'A4,\'A5,\'A6,\'A7,\'A8,\'A9,\'AA,\'AB,\'AC,\'AD," _
    & "\'AE,\'AF,\'B0,\'B1,\'B2,\'B3,\'B4,\'B5,\'B6,\'B7,\'B8,\'B9,\'BA,\'BB,\'BC,\'BD,\'BE,\'BF," _
    & "\'C0,\'C1,\'C2,\'C3,\'C4,\'C5,\'C6,\'C7,\'C8,\'C9,\'CA,\'CB,\'CC,\'CD,\'CE,\'CF,\'D0,\'D1,\'D2," _
    & "\'D3,\'D4,\'D5,\'D6,\'D7,\'D8,\'D9,\'DA,\'DB,\'DC,\'DD,\'DE,\'DF,\'E0,\'E1," _
    & "\'E2,\'E3,\'E4,\'E5,\'E6,\'E7,\'E8,\'E9,\'EA,\'EB,\'EC,\'ED,\'EE,\'EF," _
    &"\'F0,\'F1,\'F2,\'F3,\'F4,\'F5,\'F6,\'F7,\'F8,\'F9,\'FA,\'FB,\'FC," _
    & "\'FD,\'FE,\'FF"
    HexCharArray = Split(strHexCharArray, ",")
    For i = 0 To Ubound(HexCharArray)
        strString = Replace(strString, LCase(HexCharArray(i)), Chr(i+1))
    Next
    ConvertHex2Win = strString
End Function
...
Рейтинг: 0 / 0
18.03.2014, 17:45
    #38589819
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Исходя из того, что написано здесь я вроде бы поступаю правильно

http://habrahabr.ru/post/70119/

Итак, в rtf'е есть возможность использования второй половины таблицы ASCII, та что от 128 и выше. С учётом текущей кодировки (выше управляющее слово \ansicpg), конечно же. Для этого в RTF была введена последовательность вида \'hh, где hh — это двоичный hex-код символа из таблицы ASCII.



т.е. я использую эту кодовую страницу и получаю вместо турецких - русские символы.
А ms контрол показывает турецкие, что и хотелось бы мне поулчить.
Какая логика у них? в этом вопрос...
...
Рейтинг: 0 / 0
18.03.2014, 17:59
    #38589830
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
WinnipuhИсходя из того, что написано здесь я вроде бы поступаю правильно

http://habrahabr.ru/post/70119/

Итак, в rtf'е есть возможность использования второй половины таблицы ASCII, та что от 128 и выше. С учётом текущей кодировки (выше управляющее слово \ansicpg), конечно же. Для этого в RTF была введена последовательность вида \'hh, где hh — это двоичный hex-код символа из таблицы ASCII.



т.е. я использую эту кодовую страницу и получаю вместо турецких - русские символы.
А ms контрол показывает турецкие, что и хотелось бы мне поулчить.
Какая логика у них? в этом вопрос...

... конвертируйте в Юникод, у вас же на компьютере стоит codepage 1251 по умолчанию? .. вот он и показывает .. На турецком компе все было бы нормально ...
...
Рейтинг: 0 / 0
18.03.2014, 18:05
    #38589837
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
WinnipuhКакая логика у них? в этом вопрос
никакой, просто ошибки, ибо проблемы негров(кодировок отличных от Latin-1) шерифа не волнуют
...
Рейтинг: 0 / 0
18.03.2014, 23:12
    #38590009
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh, а ты не пробовал использовать стандартный RichTextBox для чтения текста?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var richText = new RichTextBox();
string rtf = @"{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset0 Arial;}}
{\colortbl ;\red0\green0\blue0;}
\viewkind4\uc1\pard\cf1\fs24\par
The \ldblquote\'fc\rdblquote , \ldblquote\'f6\rdblquote , \ldblquote\'e7\rdblquote characters are displayed as \ldblquoteᄀ?\rdblquote , \ldblquote႔?\rdblquote , \ldblquoteၹ?\rdblquote , ""႖?"", ""႗?"", ""႙?""\par
}";
byte[] buf = Encoding.UTF8.GetBytes(rtf);
var ms = new MemoryStream(buf);

richText.LoadFile(ms, RichTextBoxStreamType.RichText);
string plainText = richText.Text;

...
Рейтинг: 0 / 0
19.03.2014, 12:28
    #38590410
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
bazileWinnipuh, а ты не пробовал использовать стандартный RichTextBox для чтения текста?


пробовал, я бы и рад использовать и забыть, но в этом случае не получается.

Эта функция у меня в SQLCLR сидит, в базе.
И из полей , содеращих ртф вынимает чистый текст для индексирования
...
Рейтинг: 0 / 0
19.03.2014, 12:48
    #38590437
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
WinnipuhИ из полей , содеращих ртф вынимает чистый текст для индексирования
в этом случае - всё равно как показывается, анализируй \ansicpg
...
Рейтинг: 0 / 0
19.03.2014, 13:04
    #38590477
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
WinnipuhbazileWinnipuh, а ты не пробовал использовать стандартный RichTextBox для чтения текста?


пробовал, я бы и рад использовать и забыть, но в этом случае не получается.

Эта функция у меня в SQLCLR сидит, в базе.
И из полей , содеращих ртф вынимает чистый текст для индексирования

...так тем более, сделайте перед insert-ом replace HEX на Юникод, и пусть так и лежит ...
...
Рейтинг: 0 / 0
19.03.2014, 16:43
    #38590931
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh, если RichTextBox не получится использовать, то может взять готовую библиотеку ( раз , два )? У них открытые исходники так что можно легко встроить их прямо в в твое приложение.
...
Рейтинг: 0 / 0
19.03.2014, 19:23
    #38591150
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
bazileWinnipuh, если RichTextBox не получится использовать, то может взять готовую библиотеку ( раз , два )? У них открытые исходники так что можно легко встроить их прямо в в твое приложение.

недоделано там для таких случаев, так же для RTL текстов и т.д.
...
Рейтинг: 0 / 0
19.03.2014, 22:16
    #38591267
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuhнедоделано там для таких случаев, так же для RTL текстов и т.д.
ну тогда спецификации rtf в руки и установить адекватную цену за работу
...
Рейтинг: 0 / 0
20.03.2014, 12:44
    #38591704
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
bazileWinnipuh, если RichTextBox не получится использовать, то может взять готовую библиотеку ( раз , два )? У них открытые исходники так что можно легко встроить их прямо в в твое приложение.

проверил и второй парсер, он тоже кривой

авторRTFDocument:
Info
Creatim=2014-03-20 09:43:35
Revtim=2014-03-20 09:43:35
Printim=2014-03-20 09:43:35
Buptim=2014-03-20 09:43:35
ColorTable(1)
0:0 0 0
FontTable(1)
0:Arial Charset:0
-----------------------
Paragraph
Text:The ь, ц, з characters are displayed/saved as ?, ?, ?, "?", "?", "?"
Paragraph
...
Рейтинг: 0 / 0
20.03.2014, 12:45
    #38591709
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
ИзопропилWinnipuhнедоделано там для таких случаев, так же для RTL текстов и т.д.
ну тогда спецификации rtf в руки и установить адекватную цену за работу

там не описано то, о чем я спрашиваю.

Т.е. в каких случаях игнорируется ansicpg=nnnn?
...
Рейтинг: 0 / 0
20.03.2014, 13:38
    #38591816
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
Winnipuh,

.. все-таки я не пойму вашей задачи .. если у вас в RTF допускаются символы юникода, то что мешает вам сделать замену, напр., если ansicpg1252, то

'fc -> u0252?
'f6 -> u0246?
'e7 -> u0231?

.. и тогда это и в Африке будут турецкие буквы .. Если кодовая страница будет греческая - то соответствующие коды Юникода ....
...
Рейтинг: 0 / 0
20.03.2014, 13:54
    #38591846
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
c# и RTF вопрос
carrotikWinnipuh,

.. все-таки я не пойму вашей задачи .. если у вас в RTF допускаются символы юникода, то что мешает вам сделать замену, напр., если ansicpg1252, то

'fc -> u0252?
'f6 -> u0246?
'e7 -> u0231?

.. и тогда это и в Африке будут турецкие буквы .. Если кодовая страница будет греческая - то соответствующие коды Юникода ....

возможно я несколько сумбурно описал.

Задача такая, чего хотелось бы:

в ртф может быть практически любая кодовая страница
ansicpg1251
ansicpg1252
ansicpg1254
...

но при этом всегда 'fc - это всегда должна быть турецкая буква

Так делает richtext контрол от microsoft

Но не так ведет себя мой код, поскольку я как описано в документации по формату ртф реагирую на кодовую страницу.
Видимо в каких -то случаях не надо реагировать на нее, вот это я и пытаюсь понять.

Есть такая версия

Если указана некая
ansicpgXXXX

и указан fcharset0 и попадается такой код 'hh и если hh - это вторая часть таблицы ascii (128-255), то тогда игнорируется ansicpgXXXX и берется код из таблицы.


В этом случае в примере турецкая буква - будет всегда турецкой, она в таблице.

Корректно ли то, что я сформулировал выше для всех случаев?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# и RTF вопрос / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]