- Как решить проблему с кодировкой в java проекте когда он в utf, а данные в win1251?
- How do I convert a Windows-1251 text to something readable?
- 3 Answers 3
- java convert String windows-1251 to utf8
- 2 Answers 2
- Сокеты, windows-1251
- Базовые технологии Java /
- Баг или фича в Java: Вывод кириллических символов в консоль
Как решить проблему с кодировкой в java проекте когда он в utf, а данные в win1251?
Проблема проявляется только, если запускать проект в linux(ubutu, netbeans, если это важно).
База firebird запущена в windows, если проект запущен так же в windows, то данные из базы отображаются «корректно», если в linux, то — «кракозябрами».
В настройках jdbc «везде» стоит utf8(изменение настроек на win1251 не влияют на результат), данные в базе win1251.
Если приложение в netbeans(с теми же настройками) запущено в windows всё корректно.
Условие:
Изменить кодировку в базе нельзя.
- Вопрос задан более трёх лет назад
- 7850 просмотров
Так вот я испробовал много различных вариантов указания кодировки и не только в данном конфиге, и случайно наткнулся на параметр encoding, и вот именно он сработал установив его значением utf8.
Самое интересное что это решение работает при запуске проекта под linux(ubuntu), но при этом если проект запустить с этим параметром на windows, то там начинает проявляться именно та проблема с кодировкой которую я и пытался побороть и следовательно параметры после «пути до базы» приходится там удалять, а под linux ставить обратно.
Более правильное решение будет через параметры соединения, переданные через Properties
Проблем с кодировкой нет ни под Windows, ни под Linux
How do I convert a Windows-1251 text to something readable?
I have a string, which is returned by the Jericho HTML parser and contains some Russian text. According to source.getEncoding() and the header of the respective HTML file, the encoding is Windows-1251.
How can I convert this string to something readable?
The variable bytes contains the data shown in my debugger, it’s the result of net.htmlparser.jericho.Element.getContent().toString().getBytes() . I just copy and pasted that array here.
This doesn’t work — readableString contains garbage.
How can I fix it, i. e. make sure that the Windows-1251 string is decoded properly?
Update 1 (30.07.2015 12:45 MSK): When change the encoding in the call in convertString to Windows-1251 , nothing changes. See the screenshot below.
Update 2: Another attempt:
Update 3 (30.07.2015 14:38): The texts that I need to decode correspond to the texts in the drop-down list shown below.
Update 4 (30.07.2015 14:41): The encoding detector (code see below) says that the encoding is not Windows-1251 , but UTF-8 .
3 Answers 3
(In the light of updates I deleted my original answer and started again)
The text which appears
is an accurate decoding of these byte values
(Padded at either end with 32, which is space.)
1) The text is garbage or
2) The text is supposed to look like that or
3) The encoding is not Windows-1215
This line is notably wrong
Extracting the bytes out of a string and constructing a new string from that is not a way of «converting» between encodings. Both the input String and the output String use UTF-16 encoding internally (and you don’t normally even need to know or care about that). The only times other encodings come into play are when text data is stored OUTSIDE of a string object — ie in your initial byte array. Conversion occurs when the String is constructed and then it is done. There is no conversion from one String type to another — they are all the same.
The fact that this
does the same as this
suggests that Windows-1251 is the platforms default encoding. (Which is further supported by your timezone being MSK)
java convert String windows-1251 to utf8
I’m trying change keyboard: input cyrylic keyboard, output latin. Example: qwerty +> йцукен
It doesn’t work, can anyone tell me what i’m doing wrong?
2 Answers 2
First java text, String/char/Reader/Writer is internally Unicode, so it can combine all scripts. This is a major difference with for instance C/C++ where there is no such standard.
Now System.in is an InputStream for historical reasons. That needs an indication of encoding used.
The above explicitly sets the conversion for System.in to Cyrillic. Without this optional parameter the default encoding is taken. If that was not changed by the software, it would be the platform encoding. So this might have been correct too.
Now text is correct, containing the Cyrillic from System.in as Unicode.
You would get the UTF-8 bytes as:
The old «recoding» of text was wrong; drop this line. in fact not all Windows-1251 bytes are valid UTF-8 multi-byte sequences.
System.out is a PrintStream, a rather rarely used historic class. It prints using the default platform encoding. More or less rely on it, that the default encoding is correct.
For printing to an UTF-8 encoded file:
Here I have added a Unicode BOM character in front, so Windows Notepad may recognize the encoding as UTF-8. In general one should evade using a BOM. It is a zero-width space (=invisible) and plays havoc with all kind of formats: CSV, XML, file concatenation, cut-copy-paste.
Сокеты, windows-1251
Базовые технологии Java /
получаю ответ сервера, он в кодировке windows-1251. Как сделать русские символы читаемыми — они либо вопросами либо квадратиками
получаю ответ сервера, он в кодировке windows-1251. Как сделать русские символы читаемыми — они либо вопросами либо квадратиками
1. Уберите этот ужас:
У меня эта кодировка называется в java windows-1251
Список кодировок можно посмотреть так через javascript
(. jdk/bin/jrunscript) :
println(«Java charset names:»);
var availCS = java.nio.charset.Charset.availableCharsets();
var keyset = availCS.keySet().toArray();
for( k in keyset )
<
var key = keyset[k];
var cs = availCS.get( key );
var csName = cs.name();
var csDName = cs.displayName();
println( «name:\»»+csName+»\» — «+csDName );
>
Должно получиться что-то в духе:
.
name:»US-ASCII» — US-ASCII
name:»UTF-16″ — UTF-16
name:»UTF-16BE» — UTF-16BE
name:»UTF-16LE» — UTF-16LE
name:»UTF-32″ — UTF-32
name:»UTF-32BE» — UTF-32BE
name:»UTF-32LE» — UTF-32LE
name:»UTF-8″ — UTF-8
name:»windows-1250″ — windows-1250
name:»windows-1251″ — windows-1251
name:»windows-1252″ — windows-1252
name:»windows-1253″ — windows-1253
name:»windows-1254″ — windows-1254
name:»windows-1255″ — windows-1255
name:»windows-1256″ — windows-1256
name:»windows-1257″ — windows-1257
name:»windows-1258″ — windows-1258
.
Баг или фича в Java: Вывод кириллических символов в консоль
Есть много особенностей, про которые желательно знать, программируя на Java, даже если Вы начинающий программист. Под катом я расскажу как вывести кириллические символы в консоль Windows и наглядно это продемонстрирую.
Начнем с простого.
Их в Java 8:
- boolean;
- byte, char, short, int, long;
- float, double.
Char — это символьный тип данных. Переменная такого типа занимает 2 байта памяти, так как хранится в кодировке unicode.
С переменными этого типа можно производить только операции присваивания, но зато различными способами. Самый простой из них выглядит так:
c = ‘b’;
Символ можно представить также в виде его кода, записанного в восьмеричной системе счисления:
c = ‘\077’;
Где 077 – это обязательно трехзначное число, не большее чем 377 (=255 в десятичной системе счисления).
Или же в шестнадцатеричной системе счисления следующим образом:
c = ‘\u12a4’;
Кроме того, существуют специальные символы, такие как знак абзаца, разрыв страницы и др. Знак абзаца запишется, например, так:
c = ‘\n’;
Не нужно перечислять их здесь. При необходимости всегда можно заглянуть в справочник.
Теперь внимание. Кодировкой по-умолчанию среды программирования Java является Latin-1. Однако, при выводе в поток System.out символы преобразуются в кодировку по умолчанию для операционной системы. Так для русскоязычной локализации кодировкой по-умолчанию является Windows-1251, для linux таковой будет UTF-8. Однако по задумке Microsoft решили для консоли Windows использовать кодировку Cp866.
Соответственно вывод: для корректного отображения кириллических символов в консоли нужно выводить символы в кодировке Cp866!
Это можно сделать следующим способом:
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
public class Hello <
public static void main(String[] args) throws UnsupportedEncodingException < /*Может возникнуть исключение типа UnsupportedEncodingException*/
String x = «Привет, мир. «; //Это строка, которую мы будем выводить на экран
PrintStream printStream = new PrintStream(System.out, true, «cp866»);
/*Создаем новый поток вывода, который будет автоматически преобразоввывать символы в кодировку Cp866*/
printStream.println(x);
>
>
Сохраним полученный код в файл Hello.java. Далее создадим Hello.bat файл следующего содержания:
javac Hello.java
java -cp . Hello
pause
И поместим его в одну папку с файлом Hello.java. Должно получиться примерно так:
Далее запускаем полученный Hello.bat файл и вуаля, у нас образовался файл Hello.class в той же директории а на экран вывелось сообщение «Привет, мир. » в кодировке Cp866.
Для того, чтобы узнать, какая кодировка в данный момент используется в консоли нужно набрать там «chcp». А для того, чтобы поменять кодировку консоли, нужно набрать «chcp » например «chcp 1251». Продемонстрирую использование этой команды:
Замечание: если у Вас не находит команду javac, то заходим (для Windows 7) «Мой компьютер» — «Свойства» — «Дополнительные параметры системы» — «Переменные среды», находим «Системные переменные» и в переменную Path добавляем строку, куда установлена JDK, например «C:\Program Files\Java\jdk1.7.0_25\bin» — по умолчанию.
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.