Как я могу преобразовать международную (например, русскую) строку в \u
числа (числа Unicode)
например. \u041e\u041a
для OK
?
Преобразование международной строки в коды \u в java
Ответы (12)
Если вам это нужно для записи файла .properties
, вы можете просто добавить строки в объект свойств, а затем сохранить его в файл. Он позаботится о преобразовании.
ISO-8859-1
(первая страница юникода), а также сохраняют в этой кодировке. Вот почему ему нужны экраны \uXXXX
, и он создает их при сохранении. Хотя, начиная с версии Java 1.6 Properties, позволяет читать входные данные из объекта Reader, чтобы вы могли создавать свой собственный формат файла свойств на основе UTF-8.
- person x4u; 03.06.2011
\uXXXX
менее эффективна с точки зрения пространства, чем UTF-8 или UTF-16. Это также делает невозможным редактирование этих файлов в любом редакторе, который не поддерживает эту специальную кодировку. Но, по крайней мере, это позволяет сохранять и загружать весь текст в формате Unicode в той степени, в которой это поддерживается виртуальной машиной Java в целом.
- person x4u; 03.06.2011
есть инструменты JDK, выполняемые через командную строку следующим образом:
native2ascii -encoding utf8 src.txt output.txt
Пример :
src.txt
بسم الله الرحمن الرحيم
output.txt
\u0628\u0633\u0645 \u0627\u0644\u0644\u0647 \u0627\u0644\u0631\u062d\u0645\u0646 \u0627\u0644\u0631\u062d\u064a\u0645
Если вы хотите использовать его в своем Java-приложении, вы можете обернуть эту командную строку следующим образом:
String pathSrc = "./tmp/src.txt";
String pathOut = "./tmp/output.txt";
String cmdLine = "native2ascii -encoding utf8 " + new File(pathSrc).getAbsolutePath() + " " + new File(pathOut).getAbsolutePath();
Runtime.getRuntime().exec(cmdLine);
System.out.println("THE END");
Затем прочитайте содержимое нового файла.
Вы можете использовать escapeJavaStyleString
из org.apache.commons.lang.StringEscapeUtils
.
escapeJava
в версиях 3.x
- person Brad Mace; 25.06.2013
У меня также была эта проблема. У меня был текст на португальском языке с некоторыми специальными символами, но эти символы уже были в формате Unicode (например: \u00e3
).
Итак, я хочу преобразовать S\u00e3o
в São
.
Я сделал это, используя ресурсы Apache StringEscapeUtils. Как сказал @sorin-sbarnea. Можно загрузить здесь.
Используйте метод unescapeJava
, например:
String text = "S\u00e3o"
text = StringEscapeUtils.unescapeJava(text);
System.out.println("text " + text);
(Существует также метод escapeJava
, но он помещает в строку символы Юникода.)
Если кто-то знает решение на чистой Java, сообщите, пожалуйста.
Вот улучшенная версия ответа ArtB:
StringBuilder b = new StringBuilder();
for (char c : input.toCharArray()) {
if (c >= 128)
b.append("\\u").append(String.format("%04X", (int) c));
else
b.append(c);
}
return b.toString();
Эта версия экранирует все символы, отличные от ASCII, и корректно работает с низкими кодовыми точками Unicode, такими как Ä
.
char
.
- person mik01aj; 21.11.2018
Ответ состоит из трех частей
- Получить Unicode для каждого символа
- Определите, находится ли он на кириллической странице
- Преобразование в шестнадцатеричное.
Чтобы получить каждый символ, вы можете выполнить итерацию по строке, используя charAt()
или toCharArray()
методы.
for( char c : s.toCharArray() )
Значение char является значением Unicode.
Кириллические символы Unicode — это любые символы из следующих диапазонов:
Cyrillic: U+0400–U+04FF ( 1024 - 1279)
Cyrillic Supplement: U+0500–U+052F ( 1280 - 1327)
Cyrillic Extended-A: U+2DE0–U+2DFF (11744 - 11775)
Cyrillic Extended-B: U+A640–U+A69F (42560 - 42655)
Если он находится в этом диапазоне, это кириллица. Просто выполните проверку if. Если он находится в диапазоне, используйте Integer.toHexString()
и добавьте перед "\\u"
. В совокупности это должно выглядеть примерно так:
final int[][] ranges = new int[][]{
{ 1024, 1279 },
{ 1280, 1327 },
{ 11744, 11775 },
{ 42560, 42655 },
};
StringBuilder b = new StringBuilder();
for( char c : s.toCharArray() ){
int[] insideRange = null;
for( int[] range : ranges ){
if( range[0] <= c && c <= range[1] ){
insideRange = range;
break;
}
}
if( insideRange != null ){
b.append( "\\u" ).append( Integer.toHexString(c) );
}else{
b.append( c );
}
}
return b.toString();
Редактировать: вероятно, следует сделать проверку c < 128
и поменять местами тела if
и else
; вам вероятно следует избегать всего, что не является ASCII. Я, наверное, слишком буквально прочитал ваш вопрос.
toCharArray()
.
- person Sled; 10.02.2014
Ä
возвращается \uC4
, а не \u00c4
.
- person mik01aj; 08.12.2014
Существует инструмент командной строки, который поставляется с java и называется native2ascii< /а>. Это преобразует файлы Unicode в файлы с экранированием ASCII. Я обнаружил, что это необходимый шаг для создания файлов .properties для локализации.
Apache commons StringEscapeUtils.escapeEcmaScript(String)
возвращает строку с символами Юникода, экранированными с использованием нотации \u
.
"Art of Beer ???? ????" -> "Art of Beer \u1F3A8 \u1F37A"
Существует java-библиотека с открытым исходным кодом MgntUtils, в которой есть утилита, которая преобразует строки в последовательность юникода и наоборот:
result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);
Вывод этого кода:
\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World
Библиотеку можно найти по адресу Maven Central. или на Github. Он поставляется как артефакт maven, с исходниками и javadoc.
Вот javadoc для класса StringUnicodeEncoderDecoder.
Просто некоторые основные методы для этого (вдохновленные инструментом native2ascii):
/**
* Encode a String like äöü to \u00e4\u00f6\u00fc
*
* @param text
* @return
*/
public String native2ascii(String text) {
if (text == null)
return text;
StringBuilder sb = new StringBuilder();
for (char ch : text.toCharArray()) {
sb.append(native2ascii(ch));
}
return sb.toString();
}
/**
* Encode a Character like ä to \u00e4
*
* @param ch
* @return
*/
public String native2ascii(char ch) {
if (ch > '\u007f') {
StringBuilder sb = new StringBuilder();
// write \udddd
sb.append("\\u");
StringBuffer hex = new StringBuffer(Integer.toHexString(ch));
hex.reverse();
int length = 4 - hex.length();
for (int j = 0; j < length; j++) {
hex.append('0');
}
for (int j = 0; j < 4; j++) {
sb.append(hex.charAt(3 - j));
}
return sb.toString();
} else {
return Character.toString(ch);
}
}
Вероятно, вы могли бы взломать этот код JavaScript:
/* convert ???? to \uD83D\uDE4C */
function text_to_unicode(string) {
'use strict';
function is_whitespace(c) { return 9 === c || 10 === c || 13 === c || 32 === c; }
function left_pad(string) { return Array(4).concat(string).join('0').slice(-1 * Math.max(4, string.length)); }
string = string.split('').map(function(c){ return "\\u" + left_pad(c.charCodeAt(0).toString(16).toUpperCase()); }).join('');
return string;
}
/* convert \uD83D\uDE4C to ???? */
function unicode_to_text(string) {
var prefix = "\\\\u"
, regex = new RegExp(prefix + "([\da-f]{4})","ig")
;
string = string.replace(regex, function(match, backtrace1){
return String.fromCharCode( parseInt(backtrace1, 16) )
});
return string;
}
источник: iCompile — еще одно кодирование/декодирование Unicode для JavaScript
имя этого типа — Decode/Unescape Unicode. это ссылка на сайт онлайн-конвертер.