Как представить символ Unicode в строковом литерале VB.Net?

Я знаю, что вы можете поместить коды символов Unicode в строку VB.Net следующим образом:

str = Chr(&H0030) & "More text"

Я хотел бы знать, как я могу поместить код char прямо в строковый литерал, чтобы я мог использовать символы Unicode из представления конструктора.

Это вообще возможно?


person CodeFusionMobile    schedule 29.06.2010    source источник


Ответы (7)


Используйте функцию ChrW() для возврата символов Unicode.

Dim strW As String
strW = ChrW(&H25B2) & "More text"
person fivebob    schedule 29.06.2010
comment
Единственная проблема заключается в том, что он ломается для логических символов, для которых требуется более одного UTF-16 Char. В C# есть "\Uxxxxxxxx" с большим U и 8 цифр для их представления, и они переводятся сразу в несколько Char. Чтобы обработать их в VB, вам нужно будет посмотреть, из каких суррогатных символов они состоят, и закодировать их как ChrW(c1) & ChrW(c2). - person GSerg; 23.07.2019

Язык C# поддерживает это с помощью escape-последовательности:

var str = "\u0030More text";

Но это недоступно в VB.NET. Имейте в виду, что вы почти наверняка не захотите использовать Chr(), предназначенный для устаревшего кода, который работает с кодовой страницей по умолчанию. Вам понадобится ChrW() и передать кодовую точку Unicode.

Ваш конкретный пример не является проблемой, &H0030 - это код для "0", поэтому вы можете просто поместить его непосредственно в строковый литерал.

Dim str As String = "0MoreText"

Вы можете использовать служебную программу Charmap.exe для копирования и вставки глифов, которые не имеют простого кода ASCII.

person Hans Passant    schedule 29.06.2010
comment
0 — это обычный 0 — 0 имеет значение 48, равное 0x30, что является запрошенной кодовой точкой, поскольку эти escape-последовательности записываются в шестнадцатеричном формате. Вероятно, вы имели в виду десятичное 30, >, которое, согласно unicode.org/charts/PDF/U0000.pdf — это управляющий символ, называемый разделителем записей (или ИНФОРМАЦИОННЫМ РАЗДЕЛИТЕЛЕМ ДВА в Unicode). (Он действительно существует как кодовая точка, но у него нет глифа, поскольку он должен быть непечатаемым символом.) - person Michael Madsen; 30.06.2010
comment
+1: за рассказ об утилите Character Map (charmap.exe). Отличный совет, которым я постоянно пользуюсь. - person AMissico; 30.06.2010

Замените Chr на Convert.ToChar:

str = Convert.ToChar(&H0030) & "More text"
person John Rah    schedule 14.06.2016
comment
Есть ли какая-то польза от использования этого вместо более короткого ChrW(), предложенного в других ответах? - person ToolmakerSteve; 05.12.2018
comment
Я считаю, что ChrW() выполняет дополнительные проверки, прежде чем вызывать Convert.ToChar(). - person John Rah; 10.12.2018

Чтобы отобразить символ Unicode, вы можете использовать следующий оператор

  1. ChrW(n), где n — это число, представляющее символ Юникода.
  2. Convert.ToChar(n)
  3. введите непосредственно символ в редакторе, используя комбинацию клавиш Alt + N
  4. вставить/скопировать символ Unicode прямо в редакторе
  5. Char.ConvertFromUtf32(n)
  6. Строка XML с использованием синтаксиса &#x....;

Пример назначения символа ♥:

s = ChrW(&H2665)
s = Convert.ToChar(&H2665) 
s = "♥" 'in typing Alt+2665
s = "♥" 'using paste/copy of ♥ from another location
s = Char.ConvertFromUtf32(&H2665)
s = <text>I &#x2665; you</text>

НО когда символ Unicode больше, чем 0xFFFF (синтаксис C более читабелен ????), работают только методы 4, 5 и 6!

  1. Функция ChrW() указывает на ошибку при сборке
  2. Convert.ToChar() функция аварийно завершает работу во время выполнения
  3. Alt+N отклонен, потому что он принимает только 4 цифры

Пример

lblCharacter.Text = "This solution works ????"
Debug.Print (Char.ConvertFromUtf32(&H1F600))
s = <text>diable: &#x1F608;</text>

PS: смайлик, вставленный (0x1F600) непосредственно в редакторе кода Visual Studio или Notepad++, потерял цвет фона! Объяснение: смайлик, вставленный в этот ответ, залит оранжевым цветом, но в редакторе Visual Studio или Notepad ++ этот цвет исчез!


Чтобы использовать строковые литералы в редакторе Visual Studio, вы должны использовать метод 3 или 4!

В форме (режим конструктора)

введите здесь описание изображения

В свойствах (см. свойство Text)

введите здесь описание изображения

person schlebe    schedule 18.04.2020
comment
Мне нужно было отправить 32-битные коды для моего приложения. Функция Char.ConvertFromUtf32(n) отлично сработала для меня. Спасибо! - person Bill Norman; 18.11.2020

Я надеялся, что вы сможете использовать XML-литералы и XML-экраны, но это не работает. Я не думаю, что литералы XML позволяют использовать &#NN;. Хотя это способ включения кавычек " внутри строк.

'Does not compile :('
Dim myString = _ 
<q>This string would contain an escaped character &#30; if it actually compiled.</q>.Value 
person MarkJ    schedule 30.06.2010
comment
это хорошо работает в 2020 году в Visual Studio 2019. См. мой ответ позже. У меня нет проблем с компиляцией. Пожалуйста, проверьте еще раз и адаптируйте свой ответ (я голосую за) - person schlebe; 20.04.2020

Я использую утилиту Character Map (charmap.exe). Запустите и выберите нужные символы в шрифте элемента управления, например ©Missico™, скопируйте и вставьте в свойство Text в сетке свойств. Вам придется изменить шрифт, потому что шрифтом по умолчанию для формы является «Microsoft Sans Serif», который не является шрифтом Unicode. Я не думаю, что вы можете использовать этот метод для непечатаемых символов.

В зависимости от ваших потребностей вы также можете использовать локализацию, которая создает файлы ресурсов для каждого языка. Опять же, вы должны использовать charmap.exe для выбора и копирования необходимых символов и вставки их в файл ресурсов. Вероятно, вы можете использовать непечатаемые символы, такие как символы табуляции, новой строки и т. д., поскольку это всего лишь текстовый файл (Unicode).

person AMissico    schedule 29.06.2010
comment
Это не решит проблему, когда файл кода написан с набором символов, который не поддерживает эти символы, и может вызвать проблемы, если шрифт вашего редактора не поддерживает все символы Unicode. Не лучшее решение! - person Dan Puzey; 30.06.2010
comment
Но это является лучшим решением, если файл написан в кодировке Unicode (какой должны быть все современные текстовые файлы) и если шрифт поддерживает символы. - person Philipp; 30.06.2010

Нет, это невозможно, поскольку строки VB не поддерживают escape-последовательности. Просто используйте ChrW, что на несколько символов больше для ввода, но также немного чище.

person Philipp    schedule 30.06.2010
comment
Дело не в том, что это больше печатать, а в том, что это нельзя сделать в дизайнере форм, и более утомительно создавать форму, когда вам приходится запускать ее каждый раз, когда вы хотите ее увидеть. - person CodeFusionMobile; 30.06.2010