Я пытаюсь записать строку UTF-8 (вьетнамский язык) в Консоль C#, но никакой успех. Я работаю на Windows 7.
Я пытался использовать Encoding
класс, которые преобразовывают string
кому: char[]
кому: byte[]
и затем Представлять в виде строки, но никакая справка, строка вводится непосредственно от базы данных.
Вот некоторый пример
Tôi tên là Đức, cuộc sống thật vui vẻ tuyệt vời
Это не показывает специальный символ как Đ
или ứ
... вместо этого это обнаруживается ?
, намного хуже, чем с классом Кодирования.
Кто-либо может испытать это или знать об этой проблеме?
Мой код
static void Main(string[] args)
{
XDataContext _new = new XDataContext();
Console.OutputEncoding = Encoding.GetEncoding("UTF-8");
string srcString = _new.Posts.First().TITLE;
Console.WriteLine(srcString);
// Convert the UTF-16 encoded source string to UTF-8 and ASCII.
byte[] utf8String = Encoding.UTF8.GetBytes(srcString);
byte[] asciiString = Encoding.ASCII.GetBytes(srcString);
// Write the UTF-8 and ASCII encoded byte arrays.
Console.WriteLine("UTF-8 Bytes: {0}", BitConverter.ToString(utf8String));
Console.WriteLine("ASCII Bytes: {0}", BitConverter.ToString(asciiString));
// Convert UTF-8 and ASCII encoded bytes back to UTF-16 encoded
// string and write.
Console.WriteLine("UTF-8 Text : {0}", Encoding.UTF8.GetString(utf8String));
Console.WriteLine("ASCII Text : {0}", Encoding.ASCII.GetString(asciiString));
Console.WriteLine(Encoding.UTF8.GetString(utf8String));
Console.WriteLine(Encoding.ASCII.GetString(asciiString));
}
и вот выдающийся вывод
Nhà báo đi hội báo Xuân
UTF-8 Bytes: 4E-68-C3-A0-20-62-C3-A1-6F-20-C4-91-69-20-68-E1-BB-99-69-20-62-C3-
A1-6F-20-58-75-C3-A2-6E
ASCII Bytes: 4E-68-3F-20-62-3F-6F-20-3F-69-20-68-3F-69-20-62-3F-6F-20-58-75-3F-
6E
UTF-8 Text : Nhà báo đi hội báo Xuân
ASCII Text : Nh? b?o ?i h?i b?o Xu?n
Nhà báo đi hội báo Xuân
Nh? b?o ?i h?i b?o Xu?n
Press any key to continue . . .
class Program
{
[DllImport("kernel32.dll")]
static extern bool SetConsoleOutputCP(uint wCodePageID);
static void Main(string[] args)
{
SetConsoleOutputCP(65001);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine("tést, тест, τεστ, ←↑→↓∏∑√∞①②③④, Bài viết chọn lọc");
Console.ReadLine();
}
}
Снимок экрана с результатами (используйте Consolas или другой шрифт, содержащий все вышеперечисленные символы):
Вы должны установить Console.OutputEncoding
на соответствие UTF-8
.
Вероятно, что-то вроде:
Console.OutputEncoding = System.Text.Encoding.UTF8;
Поддерживает ли шрифт, который вы используете в окне консоли, символы, которые вы пытаетесь использовать отобразить?
Всякий раз, когда вы получаете/передаете данные из сети, помните, чтобы преобразовать в/из сети и порядок байтов хоста. Здесь следует использовать функции C htons
, htonl
и т.д. или эквиваленты на вашем языке.
Всякий раз, когда вы считываете из файла многобайтовые значения (например, UTF-16 символов или 32-разрядных int), так как этот файл мог быть создан в системе с другой зависимостью. Если файл UTF 16 или 32, он, вероятно, имеет спецификацию (метку порядка байтов). В противном случае формат файла должен будет каким-либо образом указать endianness.
-121--3165642-Исключение ClassNotFoundException возникает, когда класс, о котором сообщается, не найден ClassLoader. Обычно это означает, что класс отсутствует в CLASSPATH. Это также может означать, что данный класс пытается быть загружен из другого класса, который был загружен в родительский класс, и, следовательно, класс из дочернего класса не виден. Иногда это происходит при работе в более сложных средах, таких как App Server (WebSphere печально известен для таких проблем с классами).
Часто люди путают java.lang.NoClassDefFoundError
с java.lang.ClassNotFoundException
, однако существует важное различие. Например, исключение (ошибка, поскольку java.lang.NoClassDefFoundError
является подклассом java.lang.Error), например,
java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory
, не означает, что класс ActiveMQConnityFactory отсутствует в CLASSPATH. Совершайте совершенно противоположное. Это означает, что класс ActiveMQConnureFactory был найден ClassLoader, однако при попытке загрузить класс возникла ошибка при чтении определения класса. Обычно это происходит, когда данный класс имеет статические блоки или членов, использующие класс, который не найден ClassLoader. Чтобы найти виновника, просмотрите источник данного класса (в данном случае ActiveMQConnireFactory) и найдите код с помощью статических блоков или статических членов. Если у вас нет доступа к источнику, просто декомпилируйте его с помощью JAD.
Изучив код, скажите, что вы находите строку кода, как показано ниже, убедитесь, что класс SomeClass в вашем CLASSPATH.
private static SomeClass foo = new SomeClass();
Наконечник: Чтобы узнать, какой банке принадлежит класс, можно воспользоваться сайтом jarFinder. Это позволяет указать имя класса с помощью подстановочных знаков и выполнять поиск класса в базе данных банок данных. jarhoo позволяет вам сделать то же самое, но его больше не свободно использовать.
Если требуется найти банку, к которой принадлежит класс, в локальном пути, можно использовать служебную программу, такую как jarscan ( http://www.inetfeedback.com/jarscan/ ). Вы просто указываете класс, который вы хотите найти, и путь к корневому каталогу, где вы хотите, чтобы он начал поиск класса в банках и застежках -молниях.
-121--522357-это проблема с cmd.exe консолью. Он не поддерживает Юникод. [Не имеет отношения к C #/.NET]
Попробуйте изменить его на GUI-приложение, если можно или записать в файл.