Asc (Chr (254)) возвращает 116 в .Net 1.1, когда язык является венгерским - PullRequest
1 голос
/ 05 октября 2009

Я установил культуру на венгерский язык, и Chr (), кажется, не работает.

System.Threading.Thread.CurrentThread.CurrentCulture = "hu-US"
System.Threading.Thread.CurrentThread.CurrentUICulture = "hu-US"

Chr(254) 

Возвращает «ţ», когда должно быть «þ»

Однако Asc("ţ") возвращает 116.

Это: Asc(Chr(254)) возвращает 116.

Почему Asc () и Chr () будут разными?

Я проверил, и «широкие» функции работают правильно: ascw (chrw (254)) = 254

Ответы [ 4 ]

3 голосов
/ 05 октября 2009

Chr(254) интерпретирует аргумент системно-зависимым способом, просматривая свойство System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage. См. MSDN статью о Chr. Вы можете проверить, соответствует ли это значение тому, что вы ожидаете. "hu-US" (венгерский язык, используемый в США) может сделать там что-то странное.

Как примечание, Asc() не обещает использовать используемую кодовую страницу в своей текущей документации (она была там до 3,0).

Обычно я бы придерживался вариантов Unicode (заканчивающихся на -W), если это вообще возможно, или использовал бы класс Encoding , чтобы явно указать преобразования.

2 голосов
/ 05 октября 2009

Мое лучшее предположение состоит в том, что ваша Windows пытается представить Chr (254) = "combined" в виде комбинированной буквы, где первая буква - Chr (116) = "t", а вторая ("¸" или что-то в этом роде). ) не может быть возвращено, потому что Chr () возвращает только одну букву.

Текст в Юникоде не должен обрабатываться посимвольно.

0 голосов
/ 29 сентября 2014

Я видел несколько проблем в VBA на Mac, где символы старше 127 и некоторые управляющие символы не обрабатываются должным образом. Это включает в себя знаки абзаца (особенно в тексте, скопированном из Интернета или отсканированном), «¥» и «Ω».

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

В конце концов я попытаюсь перейти на Unicode, но я не уверен, поможет ли это этой проблеме.

Возможно, это не та проблема, которую вы наблюдаете, но я бы не стал исключать отдельные проблемы с некоторыми персонажами, подобными этой. В прошлом я отправлял заметки об этом MS, но не получил радости.

Если вы не можете найти другое решение и символ выглядит правильно при вводе, я рекомендую использовать фрагмент кода, подобный приведенному ниже, который я запускаю при обновлении таблиц. Вы, конечно, должны установить диапазон как область, которую вы смотрите. Весь файл может занять некоторое время.

        For aChar = 1 To theRange.Characters.count
            theRange.Characters(aChar).Select
            If Asc(Selection.Text) = 95 And Selection.Text <> "_" Then Selection.TypeText "Ω"
        Next aChar
0 голосов
/ 05 октября 2009

Похоже, вам нужно установить кодовую страницу для текущего потока - текущая культура не должна влиять на Asc и Chr.

Документы Chr и документы Asc имеют следующую строку:

Возвращаемый символ зависит от кодовой страницы для текущего потока, которая содержится в свойстве ANSICodePage класса TextInfo. TextInfo.ANSICodePage можно получить, указав System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage.

...