Как отключить unicode в visual studio
Я искал что-то вроде:
- Нажмите ALT
- Тип Unicode Hex
- Отпустите Alt
В настоящее время мне нужно ввести символ в слово и скопировать его в исходный файл.
ОТВЕТЫ
Ответ 1
Ответ 2
Ответ Neutrino активировал метод ввода Alt + Numpad (глоссарий Microsoft), но мне пришлось искать правильный путь в реестре. Это:
Я попытался написать символ Юникод в своих комментариях в источнике (к сожалению, я не могу ввести кодовую точку Юникода, как показано в charmap , чтобы получить соответствующий символ.
- Использование [Alt] + [+] + <xxxx>, где шестнадцатеричная кодовая точка Unicode (4 цифры) заменяет xxxx, не вводит никаких символов (ни [Numpad +], ни обычную клавишу [+]) при использовании обычные цифровые клавиши.
- В то же время, используя Numpad для 4-значного кода (он имеет только цифры), не имеет значения нажимать [+] перед вводом кодовой точки Unicode. Он просто пишет тот же символ, что и без предшествующего [+] (или в моем случае с предшествующим нулем [0]). Введенный символ - тот, который определен в кодовой странице.
- Просто для любопытства я попытался также использовать десятичный код (0x2192 = 8594) или переключать кодовую страницу с помощью chcp . Но это ничего не меняет.
(PS: Я бы добавил комментарий, но моя репутация все еще слишком низкая.)
Ответ 3
Ответ 4
Я должен сказать, что я не думаю, что выбранный ответ на самом деле отвечает на вопрос. Ввод кодовой точки Юникода в качестве escape-последовательности в строковом литерале не приводит к появлению символа Unicode в файле. Добавление escape-последовательности в литерал и ввод символа - это две разные вещи.
- Открыть RegEdit
- Перейдите в HKCR\Панель управления\Метод ввода
- Создать строковый ключ EnableHexNumpad со значением "1" (без кавычек).
- Reboot.
Теперь в любом исходном файле для ввода символа Юникода удерживайте ALT и введите numpad plus, а затем шестнадцатеричную кодовую точку, затем отпустите ALT.
например. Для © удержание ALT и введите + 00a9.
Работает в большинстве приложений Windows, включая Firefox:)
Ответ 5
Похоже, что Visual Studio по умолчанию не позволяет использовать многие из ALT-кодов. Работа вокруг - это просто вставить символ Юникода.
1) запустите charmap.exe.
2) нажмите расширенный просмотр.
3) найдите нужный символ (по имени или номеру кода).
4) скопируйте нужный символ.
5) вставьте его в свой документ.
charmap.exe поставляется со стандартными окнами. Вы можете использовать его для вставки любого символа Юникода.
Ответ 6
На всякий случай, если кто-то ищет, как это сделать в Linux, нажмите Ctrl + Shift + U , затем введите код и, наконец, нажмите Space или Enter , после чего появится символ. Работает с каждым приложением.
неспособность обернуть голову вокруг этого-настоящий источник стыда.
Я работаю с французской версией Visual Studio (2008) во французской Windows (XP). Французские акценты, помещенные в строки, отправленные в окно вывода, повреждены. Ввод Дитто С окно вывода. Типичная проблема кодировки символов, я ввожу ANSI, получаю UTF-8 взамен или что-то в этом роде. Какой параметр может гарантировать, что символы останутся в ANSI при отображении " жестко закодированного" строка в окне вывода?
покажет В выходных данных:
(здесь закодировано как HTML для вашего удовольствия просмотра)
Я бы очень хотел, чтобы он показал:
прежде чем я пойду дальше, я должен упомянуть, что то, что вы делаете, не совместимо с c/C++. The спецификация в 2.2 указано, какие наборы символов допустимы в исходном коде. Там не так много, и все используемые символы находятся в ascii. Так. Все ниже о конкретной реализации (как это происходит, VC2008 на машине локали США).
для начала, у вас есть 4 символа на cout line и 4 глифа на выходе. Так что вопрос не в том, Кодировка UTF8, поскольку она объединит несколько исходных символов с меньшим количеством символов.
от исходной строки до дисплея на консоли все эти вещи играют роль:
- в какой кодировке находится ваш исходный файл (т. е. как ваш файл C++ будет виден компилятору)
- что ваш компилятор делает со строковым литералом и какую исходную кодировку он понимает
- как ваш << интерпретирует кодированную строку, которую вы передаете в
- какую кодировку ожидает консоль
- как консоль переводит этот вывод в глиф шрифта.
1 и 2 довольно легкие. Похоже, компилятор догадывается, в каком формате находится исходный файл, и декодирует его во внутреннее представление. Он генерирует строковый литерал, соответствующий фрагменту данных в текущей кодовой странице, независимо от исходной кодировки. Мне не удалось найти явные детали / контроль на этом.
3 еще проще. Кроме контрольных кодов, << просто передает данные в char *.
4 контролируется SetConsoleOutputCP . По умолчанию используется системная кодовая страница по умолчанию. Вы также можете выяснить, какой из них у вас есть с GetConsoleOutputCP (вход управляется по-разному, через SetConsoleCP )
некоторые интересные вещи я узнал, глядя на это:
- кодировка источника не имеет значения, пока компилятор может понять это (в частности, изменив его на UTF8 не изменял сгенерированный код. Моя строка " é " все еще была закодирована с CP1252 как 233 0 )
- VC выбирает кодовую страницу для строковых литералов, которые я, похоже, не контролирую.
- управление тем, что показывает консоль, более болезненно, чем то, что я ожидал
так. что это значит для вас ? Вот несколько советов:--11-->
- не используйте не-ascii в строковых литералах. Используйте ресурсы, где вы контроль кодирование.
- убедитесь, что вы знаете, какую кодировку ожидает ваша консоль, и что ваш шрифт имеет глифы для представления символов, которые вы отправляете.
- если вы хотите выяснить, какая кодировка используется в вашем случае, я бы посоветовал печатать фактическое значение символа как целое. char * a = "é"; std::cout << (unsigned int) (unsigned char) a[0] показывает 233 для меня, что является кодировкой в CP1252.
кстати, если то, что вы получили, было" ÓÚÛ", а не то, что вы наклеили, то это выглядит как ваш 4 байта интерпретируются как CP850.
Я пробовал этот код:
отладчик показал, что wss, s и p имеют ожидаемые значения (т. е. "àéêù"), как и выходной файл. Однако то, что появилось в консоли, было óúÛ.
поэтому проблема находится в консоли Visual Studio, а не в C++. Используя превосходный ответ Бахбара, я добавил:--3-->
как первая строка, и вывод консоли затем появился, как и должен.
используя _setmode() работает (источник) и, возможно, лучше, чем изменение кодовой страницы или установка языкового стандарта, так как это фактически заставит вашу программу использовать Unicode. Пример:
В Visual Studio убедитесь, что вы настроили проект для Unicode (щелкните правой кнопкой мыши проект -> нажать общие ->Набор Символов = Используйте Набор Символов Unicode).
компилятор MinGW пользователи:
- определить как UNICODE и _UNICODE
- добавить -finput-charset=iso-8859-1 до параметры компилятора чтобы обойти эту ошибку: "преобразование в набор символов выполнения: недопустимый аргумент"
- добавить -municode до параметры компоновщика чтобы обойти "неопределенная ссылка на ' WinMain@16" (подробнее).
поскольку меня попросили, я займусь некромантией. Другие ответы были с 2009 года, но эта статья все еще появилась в поиске, который я сделал в 2018 году. Сегодня ситуация совсем иная. Кроме того, принятый ответ был неполным еще в 2009 году.
Исходный Набор Символов
каждый компилятор (включая Microsoft Visual Studio 2008 и более поздние версии, gcc, clang и icc) будет читать исходные файлы UTF-8, которые начинаются с BOM без проблем, и clang не будет читайте что угодно, кроме UTF-8, поэтому UTF-8 с BOM является наименьшим общим знаменателем для исходных файлов C и c++.
Наборы Символов Выполнения
в 2012 году компилятор добавил /utf-8 переключатель CL.EXE . Сегодня он также поддерживает /source-charset и /execution-charset выключатели, а также /validate-charset чтобы определить, если ваш файл на самом деле не UTF-8. на этой странице MSDN есть ссылка на документацию по поддержке Unicode для каждой версии Visual C++.
текущие версии стандарта C++ говорят компилятор должен иметь как набор символов выполнения, который определяет числовое значение символьных констант, таких как 'a' и набор широких символов выполнения, который определяет значение констант широких символов, таких как L'é' .
для language-lawyer немного, в стандарте очень мало требований к тому, как они должны быть закодированы, и все же Visual C и c++ удается их сломать. Он должен содержать около 100 символов, которые не могут иметь отрицательных значений, и кодировки цифры '0' через '9' должно быть последовательным. Ни заглавные, ни строчные буквы не должны быть, потому что они не были на некоторых старых мейнфреймах. (То есть, '0'+9 должно быть то же самое, что '9' , но сегодня в реальном мире все еще используется компилятор, поведение которого по умолчанию-это 'a'+9 не 'j' но '«' , и это законно.) Широкосимвольный набор выполнения должен включать базовый набор выполнения и иметь достаточно битов для хранения всех символов любого поддерживаемого место действия. Каждый основной компилятор поддерживает по крайней мере одну локаль Юникода и понимает допустимые символы Юникода, указанные в \Uxxxxxxxx , но компилятор, который не мог утверждать, что соответствует стандарту.
способ Visual C и c++ нарушают языковой стандарт, делая их wchar_t UTF-16, который может представлять только некоторые символы в качестве суррогатных пар, когда стандарт говорит wchar_t должна быть кодировка фиксированной ширины. Это потому, что Microsoft определила wchar_t as Еще в 1990-х годах, до того как комитет Юникода понял, что 16 бит будет недостаточно для всего мира, и Microsoft не собиралась ломать Windows API. Он поддерживает стандарт char32_t типа.
UTF-8 строковых литералов
третья проблема, которую вызывает этот вопрос, - как заставить компилятор кодировать строковый литерал как UTF-8 в памяти. Вы смогли написать что-то подобное с тех пор C++11:
это будет кодировать строку как ее байтовое представление с нулевым завершением UTF-8 независимо от того, является ли исходный набор символов UTF-8, UTF-16, Latin-1, CP1252 или даже IBM EBCDIC 1047 (что является глупым теоретическим примером, но все же, для обратной совместимости, по умолчанию для компилятора мэйнфреймов IBM Z-series). То есть, это эквивалентно инициализации массива с помощью < 0xC2, 0xA1, 'H', /* . , */ '!', 0 >.
если было бы слишком неудобно вводить символ, или если вы хотите различать внешне идентичные символы, такие как пространство и неразрывное пространство или предварительно составленные и комбинирующие символы, у вас также есть универсальные символы escapes:
вы можете использовать их независимо от исходного набора символов и независимо от того, сохраняете ли вы литерал как UTF-8, UTF-16 или UCS-4. Первоначально они были добавлены в C99, но Microsoft поддерживала их в Visual Studio 2015. Существует еще один способ сделать это, который работал в Visual C или C++ 2008, однако: восьмеричный и шестнадцатеричный escape-коды. Вы бы закодировали литералы UTF-8 в этой версии компилятора с помощью:
I know that I can use a tool like Notepad++ to convert the file to ASCII or some other format without BOM. But my intention would be to:
either cause LaTeX to use correct input encoding (until now I failed doing it with the package imports like:
\usepackage % unicode functionality
\usepackage[latin1]
or cause Visual Studio to save the files without BOM or in plain ASCII
Many thanks,
Ovanes
5 Answers 5
However, I don't believe Visual Studio is supposed to use the byte order marks. You said that Visual Studio is "generating" these files, but what process is really creating them? Is it the result of some sort of code generation tool? If so, that's the culprit and the place where you should focus.
I checked several of my code files and none of them contain the byte order marks.
EDIT: Changing Visual Studio Project Templates
In the comments the questioner said that these files were generated by the built-in Console Application project template. These are stored on your hard drive and can be modified if necessary.
Your installation path may vary, but on my system, I navigated to this directory:
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1033
Here I find ConsoleApplication.zip. I copied this to my desktop (for safety) and unzipped, and inside you find 4 files - a .vstemplate file, and the 3 files that are created by the project: AssemblyInfo.cs, ConsoleApplication.csproj, and Program.cs.
If you want, you can edit these files to remove the byte order marks, zip it back up, and replace the file in the source directory.
OR, to be safer, you can change the name of the template to "Console Project - No BOM" or something like that. In the .vstemplate file, there is a Name attribute that uses a Package attribute to call in information from somewhere by a guid. You can replace this name line with a simple line that specifies the name.
Then rezip the files, and put the zip file in the following path:
New projects created from this template should not contain the byte order marks, but remember, Microsoft apparently wanted those byte order marks in there, so your mileage may vary.
Item templates (like Class) can be modified in the same way - it shouldn't take too much exploring to find the default and user ItemTemplates directory.
Я знаю, что могу использовать такой инструмент, как Notepad ++, для преобразования файла в ASCII или другой формат без спецификации. Но я хотел бы:
либо заставить LaTeX использовать правильную кодировку ввода (до сих пор мне не удавалось сделать это с импортом пакетов, например:
\ usepackage % функций Unicode
\ usepackage [latin1]
или заставить Visual Studio сохранять файлы без спецификации или в простом ASCII
Большое спасибо,
Ованес
Однако я не верю, что Visual Studio должна использовать знаки порядка байтов. Вы сказали, что Visual Studio «генерирует» эти файлы, но какой процесс на самом деле их создает? Это результат какого-то инструмента для генерации кода? Если так, то это виновник и место, на котором вам следует сосредоточиться.
Я проверил несколько своих файлов кода, и ни один из них не содержит отметок порядка байтов.
РЕДАКТИРОВАТЬ: изменение шаблонов проектов Visual Studio
В комментариях спрашивающий сказал, что эти файлы были сгенерированы встроенным шаблоном проекта консольного приложения. Они хранятся на вашем жестком диске и при необходимости могут быть изменены.
Ваш путь установки может отличаться, но в моей системе я перешел в этот каталог:
C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ ProjectTemplates \ CSharp \ Windows \ 1033
Здесь я нахожу ConsoleApplication.zip. Я скопировал это на свой рабочий стол (для безопасности) и разархивировал, и внутри вы найдете 4 файла - файл .vstemplate и 3 файла, созданные проектом: AssemblyInfo.cs, ConsoleApplication.csproj и Program.cs.
При желании вы можете отредактировать эти файлы, чтобы удалить отметки порядка байтов, заархивировать их и заменить файл в исходном каталоге.
ИЛИ, для большей безопасности, вы можете изменить имя шаблона на «Консольный проект - без спецификации» или что-то в этом роде. В файле .vstemplate есть атрибут Name, который использует атрибут Package для вызова информации откуда-то с помощью guid. Вы можете заменить эту строку имени простой строкой, в которой указывается имя.
Затем повторно заархивируйте файлы и поместите zip-файл по следующему пути:
Новые проекты, созданные на основе этого шаблона, не должны содержать метки порядка байтов, но помните, что Microsoft явно хотела, чтобы эти метки порядка байтов присутствовали там, поэтому ваш пробег может отличаться.
Шаблоны элементов (например, Class) можно изменять таким же образом - не потребуется слишком много времени для поиска каталога ItemTemplates по умолчанию и пользователя.
Я не уверен, что понимаю ваш сценарий. Но если вы просто хотите преобразовать файл в ASCII из Visual Studio, выберите «Файл - Сохранить как» и переключите кодировку на ASCII.
Читайте также: