Unicode — це дуже захоплююче

Ця історія сталася майже місяць тому. Постукав до мене в скайп якийсь Єгор.

Єгор: Здрастуйте, фрілансерів шукаєте?)
Я: А ви що вмієте?
Єгор: А ми, власне, толком нічого не вміємо і хочемо працювати за досвід.)
Єгор виявився непогано підкованим хлопцем і я запропонував йому потестувати нашу либу cjCore.

Треба пояснити, що це таке. На гітхабі у нас є сховище, куди ми звалюємо свої напрацювання, а cjCore — це одна з наших бібліотек на C++.

Єгор клонував собі либу і спробував її скомпілювати, але не тут-то було. У нього виникли проблеми з компіляцією нашої юникодной String.

Як відомо, в стандартному С++ немає нормальних юнікодних рядків і тому багато пишуть для цього свої класи. Наприклад, в Qt написана своя QString на базі бібліотеки ICU. І ми теж вирішили написати свою сходинку, але стали використовувати не ICU, а бібліотеку Boost або C++11 на вибір, кому що подобається більше.

У Єгора остання версія Ubuntu, але з якоїсь причини, у нього рядок з C++11 компілюватися не захотіла, а тягнути Boost тільки заради якоїсь рядки він вважав справою занадто накладним (попутно поскаржившись на слабенький інтернет) і вирішив використовувати вільну бібліотеку, зрештою він зупинився на utfcpp.sourceforge.net.

Нахрапом взяти цю бібліотеку Єгору не вдалося. Він постійно мені скидав виникають помилки, я щось підказував, але постійно щось у нього не виходило…

Тим часом я зайшов у Вікіпедію: ru.wikipedia.org/wiki/UTF-8 і знайшов там цікаву табличку «Конвертування в UTF-8»:


І тут до мене приходить божевільна думка: написати функції перетворення UTF-8 -> UTF-32 і назад чистим кодом, без всяких бібліотек!
Я: Зараз я дещо скину, якщо у мене вийде
Єгор: Ok
Ніяких важких операцій, тільки перевірка умов, додавання і операції з бітами, 40 хвилин і готово!

Я: Для чого потрібні либы? Щоб швиденько своє сваял і все працює: github.com/sitev/cjCore/blob/master/src/test_utf32to8.cpp
Єгор: А назад?
Я Пам'ятаю, скільки часу знадобилося, щоб розібратися з кодуваннями в с++11 і бусте, напевно, тиждень
Ще хвилин 30-40 і заробила зворотна конвертація.

Єгор взявся за тестування і через якийсь час скинув скріншот:


Я: Типу оре?
Єгор: Не типу, а оре: 1 рядок — вихідна, 2 рядок — UTF-32, 3 рядок — з UTF-32 в UTF-8.
Спасибі Єгору, він оптимізував отриманий код, а я його обернув у вигляді класу Utf: github.com/sitev/cjCore/blob/master/src/utf.cpp і попросив Єгора протестувати швидкодію.

Результат не змусив себе чекати, швидкість в 2-2.5 рази швидше, ніж utfcpp.sourceforge.net! На жаль, порівняти по швидкості з іншими бібліотеками, у нас не знайшлося часу, а спробуйте самі і викладіть результати в коментарях.

Як виявилося, процес програмування перекодування Юнікоду туди-назад дуже захоплюючий, змушує з палаючими очима і прискореним серцем швидко-швидко стукати по клавішах…
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.