Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать кодировку текста (string)? возможную "однобайтовую" кодировку 
:(
    Опции темы
Pankon
Дата 7.5.2008, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Есть Unicode - текст.

Как узнать, какую возможную "однобайтовую" кодировку можно использовать для этого текста без "потери символов".


PM MAIL   Вверх
mr.DUDA
Дата 7.5.2008, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вопрос задан непонятно.


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 7.5.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



В Unicode тексте я могу хранить как русские, английские, чешские буквы. 

Если текст содержит только русские, я мог бы использовать  "однобайтовую"  ISO-8859-5.
Если текст содержит только английские, я мог бы использовать  "однобайтовую"  ISO-8859-1(или лучше US-ASCII).
Если текст содержит только чешские, я мог бы использовать  "однобайтовую"  ISO-8859-2,

ну и так далее


Ясно, что если текст содержит и русские и чешские,то подходящую "однобайтовую" кодировку не найти.
PM MAIL   Вверх
mr.DUDA
Дата 7.5.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



ИМХО, это на http://www.unicode.org надо разбираться, как у них там диапазоны кодировок устроены.


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 7.5.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Цитата(mr.DUDA @  7.5.2008,  16:36 Найти цитируемый пост)
ИМХО, это на http://www.unicode.org надо разбираться, как у них там диапазоны кодировок устроены.
 это самый длинный путь.....

Я думал, есть попроще ....

PM MAIL   Вверх
Любитель
Дата 7.5.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



ИМХО готового решения нет. Наверно, лучшим способом будет заполнить маппинг для всех символов на множество доступных энкодингов, а затем искать интерсект этих множеств для всех символов строки. Для проверки для отдельного символа - получаем от энкодинга энкодер (encoding.GetEncoder()), ставим ему для свойства Fallback или свой класс, или (для простоты) - EncoderFallback.ExceptionFallback. Ну и или в своём лкассе, или просто в catch убираем энкодинг из списка допустимых для полученного символа (вначале для всех символов ставим все возможные энкодинги). Типа общая идея smile

Добавлено через 3 минуты и 22 секунды
Ах да - при инициализации множеств заполняем их не всеми энкодингами, а только однобайтовыми (раз такое условие). Чтоб потом лишних проверок избежать.


--------------------
PM MAIL ICQ Skype   Вверх
Pankon
Дата 7.5.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 739
Регистрация: 2.6.2005

Репутация: 3
Всего: 5



Любитель, не совсем понятно.... smile 
PM MAIL   Вверх
mr.DUDA
Дата 7.5.2008, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Любитель, всё равно это не поможет найти именно ту единственную однобайтовую кодировку, которая подходит для всех символов в файле, и о которой вопрос в первом посте.


--------------------
user posted image
PM MAIL WWW   Вверх
Любитель
Дата 7.5.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Код

// Заполнение маппинга
Dictionary<char, Set<Encoding>> mapping = new Dictionary<char, Set<Encoding>>();

Set<Encoding> allSingleBytesEncodings = new Set<Encoding>();
foreach (Encoding encoding in Encoding.GetEncodings())
{
    if (encoding.IsSingleByte)
       allSingleByteEncodings.Add(encoding);
}

for (char c = char.MinValue; c < char.MaxValue; c++)
{
    Set<Encoding> set = new Set<Encoding>();

    foreach (Encoding encoding in allSingleByteEncodings)
    {
        encoding.GetEncoder().Fallback = EncoderFallback.ExceptionFallback;
        try
        {
            encoding.GetBytesCount(c.ToString()); // при неудаче вылетаем в catch, иначе - добавляем энкодинг
            set.Add(encoding);       
        }
        catch { }
    }

    mapping[c] = set;
}

// Проверка для строки
if (s.Length == 0)
   return ???; // неважно

if (s.Length == 1)
   return mapping[s[0]].AsReadOnly();

Set<Encoding> set = new Set<Encoding>(mapping[s[0]]);

for (int i = 1; i < s.Length; i++)
{
    set.IntersectionWith(mapping[set[i]]);
    if (set.Count == 0)
        return set; // или null - смотри сам...
}

return set;


Что-то такое вроде.

Добавлено @ 17:23
Цитата(mr.DUDA @  7.5.2008,  17:14 Найти цитируемый пост)
найти именно ту единственную однобайтовую кодировку, которая подходит для всех символов в файле

Дык проверять без сомненья для всех символов. И не единственную - а их множество. Кстати, Set в примере выше из PowerCollections с кодеплекса. Для .Net FX 3.5 можно заменить на HashSet. Последнего под рукой нет (3.5) smile

Это сообщение отредактировал(а) Любитель - 7.5.2008, 17:37


--------------------
PM MAIL ICQ Skype   Вверх
Любитель
Дата 7.5.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 11
Всего: 92



Так, исправил до компилируемого и работающего состояния. Правда маппинг этот заполняется очень долго (вариант - заполнить один раз и сохранить в файл smile ).

Код

    public static class EncodingsChecker
    {
        private static Dictionary<char, Set<Encoding>> mapping =
            new Dictionary<char, Set<Encoding>>();

        private static Set<Encoding> GetAllSingleByteEncodings()
        {
            Set<Encoding> set = new Set<Encoding>();

            foreach (EncodingInfo encodingInfo in Encoding.GetEncodings())
            {
                Encoding encoding = (Encoding)encodingInfo.GetEncoding().Clone();
                encoding.EncoderFallback = EncoderFallback.ExceptionFallback;

                if (encoding.IsSingleByte)
                    set.Add(encoding);
            }

            return set;
        }

        static EncodingsChecker()
        {
            Set<Encoding> allSingleByteEncodings = GetAllSingleByteEncodings();

            for (char c = char.MinValue; c < char.MaxValue; c++)
            {
                Set<Encoding> set = new Set<Encoding>();

                foreach (Encoding encoding in allSingleByteEncodings)
                {
                    try
                    {
                        encoding.GetByteCount(c.ToString());
                        set.Add(encoding);
                    }
                    catch { }
                }

                mapping[c] = set;
            }
        }

        public static ICollection<Encoding> GetEncodings(string s)
        {
            if (s.Length == 0)
                return GetAllSingleByteEncodings();

            if (s.Length == 1)
                return mapping[s[0]].AsReadOnly();

            Set<Encoding> set = new Set<Encoding>(mapping[s[0]]);

            for (int i = 1; i < s.Length; i++)
            {
                set.IntersectionWith(mapping[s[i]]);
                if (set.Count == 0)
                    return set;
            }

            return set;
        }
    }


Это сообщение отредактировал(а) Любитель - 7.5.2008, 18:08


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0659 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.