27.07.2012, 14:57 | #1 |
Участник
|
Конвертация текста из кириллицы в латинский алфавит
Здравствуйте.
При генерации бар кодов, столкнулся с проблемой невозможности работы с кириллицей. Есть ли какой нибудь алгоритм, превращающий текст на кириллице в транс лит. |
|
27.07.2012, 14:59 | #2 |
Banned
|
Ищите здесь на форуме, было.
|
|
27.07.2012, 15:31 | #3 |
Ищущий знания...
|
Цитата:
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.07.2012, 12:08 | #4 |
Участник
|
|
|
30.07.2012, 12:22 | #5 |
MCITP
|
Цитата:
__________________
Zhirenkov Vitaly |
|
30.07.2012, 12:43 | #6 |
MCITP
|
А почему просто не взять гост ?
http://transliteration.ru/gost |
|
30.07.2012, 12:44 | #7 |
Участник
|
Не помню. Я и мягкий знак как-то переводил. Можно взять любые 2 латинские буквы: главное, чтобы их комбинация была уникальной.
Тут ведь задача какая: Шаг 1. Переводим кириллицу в латиницу. Шаг 2. Переводим латиницу в бар-код. Шаг 3. Переводим бар-код в латиницу (считываем бар-код). Шаг 4. Переводим латиницу в кириллицу. Шаг 5. Profit. И важна в первую очередь однозначность. Читаемость латиницы можно рассматривать как необязательный дополнительный бонус. |
|
30.07.2012, 12:51 | #8 |
Участник
|
Цитата:
Сообщение от GBH
А почему просто не взять гост ?
http://transliteration.ru/gost Просто в данном примере было например непонятно, если написано "ja", то это "я" или "йа", если написано "sch", то это "щ" или "сцх". Кстати, если исходный текст может содержать как кириллицу, так и латиницу, то тут понадобится ещё и спецсимвол. Последний раз редактировалось Dark Light; 30.07.2012 в 12:53. |
|
30.07.2012, 13:29 | #9 |
Модератор
|
А, простите, в чем сакральный смысл переводить латиницу в бар-код? баркод для того и предназначен, что представляет из себя закодированный идентификатор. Который можно потом по базе найти и расшифровать. Если необходимо с помощью баркода переносить какую - либо информацию, то смотрите в сторону 2х мерных кодов.
С Уважением, Георгий |
|
30.07.2012, 13:49 | #10 |
Участник
|
Цитата:
Сообщение от George Nordic
А, простите, в чем сакральный смысл переводить латиницу в бар-код? баркод для того и предназначен, что представляет из себя закодированный идентификатор. Который можно потом по базе найти и расшифровать. Если необходимо с помощью баркода переносить какую - либо информацию, то смотрите в сторону 2х мерных кодов.
С Уважением, Георгий Если есть необходимость, например, в накладной бар-кодом выводить её номер, и при этом маска номера содержит кириллицу (например, Нклд--00001), то особого выбора нет. |
|
30.07.2012, 16:08 | #11 |
Участник
|
ещё вариант:
я делал такой "финт ушами" для BC 128 в 3.0, едиственный минус - растет длина штрихкода :
X++: static str IsolateSymbols(str _inputStr) { str Code128SymbCard ="_!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz[\]^`{|}~\"\'"; str charBC, charBC_prev, charBC_next; int len, i; str encodedStr; ; //Формирование строки штрихкода len = strlen(_inputStr); for(i=1; i<=len;i++) { charBC_prev = i==1 ? "" : substr(_inputStr,i-1,1); charBC = substr(_inputStr,i,1); charBC_next = substr(_inputStr,i+1,1); //изоляция руских букв, пробелов, etc if(strfind(charBC,Code128SymbCard,1,1)<=0) // не нашли символ в таблице символов CODE128 { charBC = int2str(char2num(charBC,1)); if(strlen(charBC)<3) charBC = "0"+ charBC; //ascii для пробела, etc //проверка пред. и след. символа //есть некорректный пред. символ if(charBC_prev!="" && strfind(charBC_prev,Code128SymbCard,1,1)<=0) encodedStr += charBC; else encodedStr += "{"+ charBC; //есть некорректный след. символ if(charBC_next!="" && strfind(charBC_next,Code128SymbCard,1,1)<=0) encodedStr += ""; else encodedStr += "}"; } else encodedStr += charBC; } return encodedStr; } |
|
30.07.2012, 16:27 | #12 |
MCITP
|
2 virhundo
Не совсем понятно, если честно. Проверки на регистр нет, но контейнер включает буквы с разными регистрами. strfind тоже всё равно до регистра. В итоге я получу, наверно, не то, что хочу. Всё таки коды "А" и "а", разные. Хотя, для текущей задачи может этого и не надо. UPD. По ходу напутал что-то я со strfind. Последний раз редактировалось GBH; 30.07.2012 в 16:33. |
|
30.07.2012, 16:37 | #13 |
Участник
|
сорри,
разве char2num("а",1) и char2num("А",1) - одно и тоже? |
|
30.07.2012, 16:39 | #14 |
MCITP
|
|
|
30.07.2012, 16:45 | #15 |
Участник
|
Хотя по сейчас я склоняюсь к промежуточной таблице кодирования штрихкода номерной серией, допустим при печати штрихкода функция типа findOrCreate() cопоставляет "Накл --001" c цифровым 12345 и кодирует в баркод уже 12345. При чтении - наоборот по промежуточному коду получаем значение "Накл --001" . Тогда получается самый компактный и читаемый штрихкод.
|
|
01.08.2012, 14:11 | #16 |
Участник
|
X++: static str translit(str value, boolean letteronly = false) { container rus = ['а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']; container lat = ['a','b','v','g','d','e','jo','zh','z','i','j','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','sch','','y','','e','ju','ja']; int i, n; str letter; str ret; ; for (i = 1;i<=strlen(value);i++) { letter = strlwr(substr(value,i,1)); n = confind(rus,letter); ret += n>0 ? conpeek(lat,n) : letter; } return letteronly ? strkeep(ret,'abcdefghijklmnopqrstuvwxyz0123456789') : ret; } |
|