Замена определенных символов Юникода в строках, считанных из Excel - PullRequest
5 голосов
/ 03 октября 2011

Я пытаюсь заменить некоторые нежелательные символы в строке, извлеченной из электронной таблицы Excel. Причина в том, что в нашей базе данных Oracle используется набор символов WE8ISO8859P1, который не определяет несколько символов, которые Excel «услужливо» вставляет для вас в тексте (фигурные кавычки, em и en dashes и т. Д.), Поскольку я не имею никакого контроля над базой данных или как создаются электронные таблицы Excel, мне нужно заменить символы чем-то другим.

Я извлекаю содержимое ячейки в строку таким образом:

string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim();

Просмотр строки в текстовом редакторе Visual Studio Визуализатор показывает текст, который будет завершен и правильно извлечен. Далее я пытаюсь заменить один из нежелательных символов (в данном случае правый символ фигурной кавычки):

s = Regex.Replace(s, "\u0094", "\u0022");

Но он ничего не делает (Text Visualiser показывает, что он все еще там). Чтобы попытаться проверить, что символ, который я хочу заменить, действительно присутствует, я попытался:

bool a = s.Contains("\u0094");

но возвращается false. Тем не менее:

bool b = s.Contains("”");

возвращает истину.

Мое (несколько недостающее) понимание строк в .NET заключается в том, что они кодируются в UTF-16, тогда как Excel, вероятно, будет использовать ANSI. Значит ли это, что мне нужно изменить кодировку текста в Excel? Или я здесь что-то не так делаю? Любой совет будет принята с благодарностью. Я прочитал и перечитал все статьи, которые я могу найти о Юникоде и кодировке, но я все еще не знаю.

Ответы [ 2 ]

4 голосов
/ 03 октября 2011

Да, строки в .Net: UTF-16 .

Вы делаете это правильно; возможно, ваша шестнадцатеричная математика неверна. Персонаж, которого вы проверяли, не "\u0094" (не уверен, что вы это имели в виду). У меня сработало следующее:

((int)"”"[0]).ToString("X") возвращает "201D"

"”" == "\u201D" возвращает true

"\u0094" == "" (правая часть - пустая строка) возвращает false

Многие текстовые символы UTF-16 будут отображаться текстовой визуализатором как пустая строка, но они могут быть либо неотображаемым символом, либо частью суррогата (т. Е. Некоторые символы, возможно, придется вводить "\UXXXXXXXX", тогда как другие можно использовать с (четыре цифры) "\uXXXX".). Мои знания в этой области очень ограничены.

Ссылки - Статьи Джона Скита на:

2 голосов
/ 07 октября 2011

Вы можете использовать NVARCHAR и NTEXT вместо VARCHAR и TEXT для столбцов, которые должны вместить эти символы.Таким образом, вам не нужно конвертировать всю базу данных, и вы можете рассчитывать на будущее, потому что столбцы будут Unicode.

...