- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
/*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
@bug 4890726
@summary Check the correctness of KOI8_U by comparing to KOI8_R
*/
import java.util.*;
import static java.lang.Character.UnicodeBlock;
public class UkrainianIsNotRussian {
private static String decode(byte[] bytes, String encoding) throws Throwable {
String s = new String(bytes, encoding);
equal(s.length(), 1);
check(Arrays.equals(s.getBytes(encoding), bytes));
return s;
}
private static void realMain(String[] args) throws Throwable {
final byte[] bytes = new byte[1];
int differences = 0;
for (int i = 0; i < 0xff; i++) {
bytes[0] = (byte) i;
final String r = decode(bytes, "KOI8_R");
final String u = decode(bytes, "KOI8_U");
if (! r.equals(u)) {
differences++;
final char rc = r.charAt(0);
final char uc = u.charAt(0);
final UnicodeBlock rcb = UnicodeBlock.of(rc);
final UnicodeBlock ucb = UnicodeBlock.of(uc);
System.out.printf("%02x => %04x %s, %04x %s%n",
i, (int) rc, rcb, (int) uc, ucb);
check(rcb == UnicodeBlock.BOX_DRAWING &&
ucb == UnicodeBlock.CYRILLIC);
}
}
equal(differences, 8);
}
//--------------------- Infrastructure ---------------------------
static volatile int passed = 0, failed = 0;
static void pass() {passed++;}
static void fail() {failed++; Thread.dumpStack();}
static void fail(String msg) {System.out.println(msg); fail();}
static void unexpected(Throwable t) {failed++; t.printStackTrace();}
static void check(boolean cond) {if (cond) pass(); else fail();}
static void equal(Object x, Object y) {
if (x == null ? y == null : x.equals(y)) pass();
else fail(x + " not equal to " + y);}
public static void main(String[] args) throws Throwable {
try {realMain(args);} catch (Throwable t) {unexpected(t);}
System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
if (failed > 0) throw new AssertionError("Some tests failed");}
}
А в 2019-м году в «Java» кто-нибудь пользуется восьмибитными кодировками?
Был почтовый сервис http://е-письмо.рф/ –— не взлетел. С таким ящиком нельзя было зарегистрироваться на форумах ни как вася@е-письмо.рф, ни как %D0%B2%D0%B0%D1%81%D1%[email protected]. А всё потому, что кто-то всё делает по старым мануалам.
MOVET DAVE ZLOEBU^.
Ага. И надеяться, что во всех сборочных скриптах не забыли это сделать.
Имхо, проще для разработки юзать пути без пробелов. Даже на венде. Зачем себе грабли раскладывать?
Похоже, что новую IDE и библиотеку делали разные отделы.
Винда смотрела досовскую запись, только если длинное имя отсутствовало или было запорото.
Если бы функция «с A на конце» не умела читать юникодные имена, она не смогла бы обработать запросы к «Program Files» и к «Мои документы». Внутри функциям «с A на конце» приходилось совершать нелепую операцию: расширять входную строку в локальной кодировке до юникода (возможно, это расширение происходило где-то в недрах драйвера файловой системы).
*****
Представь себе, что ты по ошибке создал директорию «Цыплёнок» и хочешь переименовать её в «Индюшонок». Вызываешь MoveFileA("Цыплёнок", "Индюшонок");
Что будет дальше? Мои догадки:
1. "Цыплёнок" из 1251 будет преобразована в Unicode.
2. Драйвер будет искать "Цыплёнок" в Unicode.
3. Если не найдёт (например, директория была создана в голом DOS), преобразует в 866 и будет искать "ЦЫПЛЁНОК" (хотя он и в предыдущем пункте будет искать так же, ибо в Винде файлы регистронезависимы).
4. Теперь нужно переименовать. Второй аргумент ("Индюшонок") будет преобразован из 1251 в Unicode.
5. Длинное имя будет заменено на "Индюшонок". Если его не было (директория была создана в голом DOS), оно будет создано.
6. Для совместимости с DOS нужно обновить и короткое имя. "Индюшонок" будет преобразовано в 866, затем в верхний регистр. Если не влезло в 8 символов или есть символы, запрещённые в DOS, имя будет усечено с добавлением тильды и произвольного числа для предупреждения коллизий. В данном случае нужно будет записать "ИНДЮШО~1".
Windows NT, в отличие от 95, уже не всегда генерирует осмысленные короткие имена. Вместо "ИНДЮШО~1" она может сгенерировать "65A8FC~1". Какой багор)))
1. Первый аргумент 1251→Unicode.
2. Опционально Unicode→866 (если длинное имя не найдено).
3. Второй аргумент 1251→Unicode.
4. Unicode→866 (для генерации короткого имени).
Функция MoveFileW тратила меньше сил, ибо аргументы уже были в Unicode.
>> А тот получит ObjectAttributes с полем
PUNICODE_STRING ObjectName
На NT понятно. Но самое смешное, что в «Windows 95» была та же семантика, хотя никакого ntoskrnl не было.
Неверно. Он сначала поищет Цыплёнок (двубайтовый), а потом ЦЫПЛЁНОК в однобайтовой кодировке.
ЦЫПЛЁН~1 он искать НЕ будет, если мы явно именно так с тильдой не попросим найти.
*****
С этим связан прикол. В реестре путь к «Program Files» в некоторых местах прописан как «C:\Program Files», а в некоторых как «C:\PROGRA~1». В свежеустановленной винде обычно они соответствуют одной и той же директории, поэтому никаких проблем юзер не замечает.
Сценарий диверсии:
1. Временно переименовываем «Program Files» в «Pituh».
2. Создаём «C:\Programms». В 8 символов не уложились, поэтому создастся короткое имя «C:\PROGRA~1» (других директорий, начинающихся на «PROGRA» сейчас в корне нет, поэтому будет единичка).
3. Переименовываем «Pituh» обратно в «Program Files». Поскольку «PROGRA~1» уже занято, будет создано короткое имя «PROGRA~2».
4. Итог: «PROGRA~2» связано с «Program Files», а «PROGRA~1» связано с другой директорией.
Теперь у нас «PROGRA~1» и «Program Files» соответствуют разным директориям.
Какой же адский багор. Уже много лет Microsoft ратуют за использование «SHGetKnownFolderPath()», а сами продолжают хардкодить пути в сраном «8.3», сдохшем задолго до рождения многих современных программистов?
«MS Office» и адобовские продукты любят срать в реестр путями в формате «8.3». Ещё инсталяторы зачастую прописывают пути к деинсталяторам в таком же формате.
Ну, всякие %ProgramFiles, %AppData%, %SystemRoot%, %Temp% и им подобные вроде как уже сто лет в винде существуют.
> «MS Office» и адобовские продукты любят срать в реестр путями в формате «8.3». Ещё инсталяторы зачастую прописывают пути к деинсталяторам в таком же формате.
Печально всё это.
И вот оттуда ссылка:
Допустим, на картах памяти с файловой системой FAT короткие имена нужны, чтобы их видел фотоаппарат или плеер.
На NTFS короткие имена могли быть задействованы в следующих случаях:
1. Досовской программой, запущенной из-под NTVDM. Сейчас неактуально, поскольку в 64-битных виндах нет NTVDM (неофициальный проект NTVDM64 сейчас не рассматриваем).
2. Досовской программой, запущенной через эмулятор (DOSBOX и всякие виртуалки). Однако, в этом случае генератор коротких имён можно встроить в сам эмулятор. Нет никакой нужды поддерживать его системой.
3. DOS'ом через неофициальный драйвер NTFS. Однако, и в этом случае генератор коротких имён можно встроить в драйвер.
И правда, на NTFS генерировать короткие имена сейчас нет смысла. Разве что ради всякого говна, которое любит прописываться в C:\PROGRA~1, но на этот случай можно сделать симлинк (или directory join).
а если выставить "." то работает
З.Ы. Kerbal Space Program падал на линупсах с аналогичной ошибкой. Так что и на C# на те же самые грабли с локалями наступают...
В западных –— это в США и в Великобритании.
Страны, принявшие нормы ISO, пишут запятую.
У арабов свой сепаратор, но у них и цифры другие (хотя мы свои цифры называем арабскими).
В довоенных академических британских журналах я видел точку, поставленную в середине строки. Вот так, например: 3·14159265. И это не умножение, а именно сепаратор.
В Канаде жопа. В Квебеке и в прочих франкоговорящих провинциях используют запятую, mon tabarnac! А в англоговорящих –— точку.
Подозреваю, что швейцарец Никлаус Вирт использовал в «Паскале» не родную запятую, а точку и английские ключевые слова, чтобы сделать его популярным в США, иначе «Бройлер Паскаля» и «Дельфи» мы бы не увидели. Хотя с другой стороны, язык с циклом в стиле «für i:=0 nach 9» мог бы заинтересовать «SAP»...
Причём есть ещё персидский вариант (начертание пары значков отличается).
Например в '(LISP) {TCL} и [Red] вообще нет разделителей, всё пишется через пробелы.
В "Red" кстати можно использовать в дробях и "," и ".", а ещё в нём 3 или более числа разделённых точкой —– это кортеж (с запятыми, почему-то, такого нет). Кстати, в {Red} полно разных 'литералов на все случаи жизни:
Я хотел пиздеть про осемблеры, форты, сишки, но как зарегал файку почему-то всё прошло.
> То-есть сломать железо из витуалки никак нельзя?
Ну не зря же виртуалки придумали. Хотя, может быть и можно, но Крис умир, а борманд молчит,не у кого спросить.
А вообще-то я своим петушиным моском нихуя не понял, что ты нопейсал. Что делает Вирт у Аллки?
https://ideone.com/aTABMJ
Оператор "-" для строк в «Java» не определён, а перегрузки операторов в этом языке нет.
Я не понял, мой конплукхтер за Путена? То ли дело "DOS". Segmentation fault.
А если считать, что это строки, то можно вообще всё в строку записать и радоваться.
system.out.println("Миру - мир!") - и ни минус, ни восклицательный знак не мешают.
Может быть автор вычел Путена из того что лежало в стеке, и сохранил результат по адресу хуйла.
https://ideone.com/Gquu3i
Константа Сёмы.
^udesnyj wolap@k, kotoryj wse e]e movno ^itatx.
Кстати, некоторые украинцы не знают, что у них в раскладке есть «Ґ». Они даже не знают, в каких словах (кроме «ґавно») она употребляется.
Знакомство компьютером с кодировкой «КОИ-7» и клавиатурой с раскладкой «JCUKEN» не прошло бесследно.
Кириллицу и другие юникодные символы портит хуйлайтер.
В таком режиме кириллица вставляется.
Запустил его, чтобы он перегенерировал регулярки. Теперь кириллица с хуйлайтером вставляется, латиница нет.
Какой багор )))
Чувствую, что исходники пакета «Pygments» можно целиком публиковать на «Говнокоде».
В общем, запускайте пока ipython без него (с ключом --simple-prompt).
То же самое если раскладку клавиатуры поменять.
>--simple-prompt)
Это с какой версии?
https://ipython.readthedocs.io/en/5.x/config/options/terminal.html
В документации по 6.x уже появилась строчка «CLI option: --simple-prompt»:
https://ipython.readthedocs.io/en/6.x/config/options/terminal.html
В четвёрке не было ни того, ни другого.
З.Ы. Кстати, по ощущениям она шустрее предыдущих и её реже фризит.
Впизду его. Я не дождусь пока он распарсит файлы.
А что в R# есть реально полезного помимо рефакторинга?
Не, это на хасвелле.
> nvme
Обычный ssd.
pROSTO W "koi-7" SIMWOLOW `{|}~ NE BYLO, PO\TOMU Q IH NE SRAZU WSPOMNIL.
С искусственными языками по мере накопления опыта понимаешь, где нормально, а где говно, из-за которого программирование превращается в лютый ад.
А в естественных всё время "кококо, это наше наследие" и "кококо, а мне норм, я привык".
Например, питушню с запятыми в русском языке надо жестоко давить гидравлическим прессом.
А что с ней не так? Абсолютное большинство запятых вполне чётко определяют место, в котором при прочтении будет стоять пауза.
Но не кажется ли тебе обидным, что он пишет также и с других фаек, коих у него целый гарем?
—– Кококо, это наше наследие!
А вообще в «Java» уже лет 15 как есть генерики.
Ещё препроцессор используется для эмуляции констант, потому что в старой сишке не было слова «const».
Ещё препроцессор используется для эмуляции модульной системы: прототипы функций копируются в h-файлы.
Для чего ещё?
Создаём класс для колонии-поселения без петухов, а от него наследуем класс для чёрной зоны с петухами.
А через "ґ" могу навскидку вспомнить " ґаву", "ґаздиню", "ґедзя", "ґудзик" и "аґрус".
Напомнило анекдот про то, как из-за одного слова создали новый язык.
https://vinauto777.livejournal.com/21145.html
dA I TO SOWSEM NEMNOGO, DA PO^TI ^TO NI^EGO.
eSLI TY, ^UWAK, INDEEC, TY NAJDE[X SEBE OTTQG.
nASTOQ]EMU INDEJCU ZAWSEGA WEZDE NI[TQK.
MOVET DAVE ZLOEBU^.
Болгары восхитились КОИ.
Вспомнил, как я ставил кажется Слаку, и там можно было выбрать раскладку, и там было написано: Cyrillic (Bulgarian, Belarussian)
Кстати, БДС — български державен стандарт.
https://kbd-intl.narod.ru/images/bg.png
У некоторых язык тянется назвать её «УЁБИЩЕ».
Когда умер Децл, все стали рэперами.
Короче, не умирай, Мразиш.