Текущее время: Ср, июл 23 2025, 20:40

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: преобразовать строчку с в x в unicode контексте, но шоб 1 байт/символ
СообщениеДобавлено: Пн, дек 04 2006, 17:16 
Начинающий
Начинающий

Зарегистрирован:
Пн, ноя 13 2006, 18:13
Сообщения: 4
Здравия!

Люди, помогите решить задачку.

Значит дано
data src(5) value 'пофиг'.
data dest(5) type x.

Требуется преобразовать src в dest и назад.

Если буду делать через филд-символ & casting, то каждый символ строки преобразуется в 2 байта (мы в юникоде), и мне не хватит dest (сделать dest длины 10 по условию задачи нельзя :))). Всё обрежется, и обратное преобразование не пройдёт.

В не-юникоде всё прокатывает (понятно)
Как быть?
:roll:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, дек 04 2006, 18:15 
Начинающий
Начинающий

Зарегистрирован:
Пн, ноя 13 2006, 18:13
Сообщения: 4
вообщем вопрос не совсем корректен, ведь некоторые символы (Ctrl-Z какой-нить например)в src могут реально кодироваться 2-мя байтами, и тогда усекать до одного не верно.

Но всё же, допустим в src все символы кодирются как '00XX'.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 30 2008, 12:23 
Специалист
Специалист

Зарегистрирован:
Пт, фев 16 2007, 09:49
Сообщения: 157
Привет! Ты решил эту задачу? Мне тоже нужно преобразование символов в байты для шифровки данных. :wink:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 30 2008, 12:58 
Специалист
Специалист

Зарегистрирован:
Пн, янв 14 2008, 10:33
Сообщения: 163
тоже вот пакет есть: SCP полезный по кодировке


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, июн 30 2008, 12:59 
Специалист
Специалист

Зарегистрирован:
Пт, фев 16 2007, 09:49
Сообщения: 157
Спасибо! :roll:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 02 2008, 13:50 
Специалист
Специалист

Зарегистрирован:
Пт, фев 16 2007, 09:49
Сообщения: 157
А есть ли более простые способы конвертации символа в 16ричный код и обратно. А то ФМ-ли SCMS_* есть либо из текста в любой формат, либо из binary в любой формат. А из 16ричного кода в текст нету.

Что-то вроде этого: смотрим в какой кодировке данные в таблице, далее обращаемся к таблице кодировки и считываем номер символа.
Во всех языках программирования такое же есть, неужели здесь нету?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 02 2008, 15:07 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 26 2006, 15:07
Сообщения: 227
Не уверен прокатил ли,
что если попробовать записать в файл (как текст)на апликейшне с добавкой
Code:
encoding NON-UNICODE
(если можно конечно)
а затем прочитать файл как бинарный?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 02 2008, 15:35 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
matel написал(а):
Не уверен прокатил ли,
что если попробовать записать в файл (как текст)на апликейшне с добавкой
Code:
encoding NON-UNICODE
(если можно конечно)
а затем прочитать файл как бинарный?
Это как в поговорке - из пушки по воробьям?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июл 02 2008, 16:05 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
как-то приходилось решать такую проблемку.
правда на 5.0 с unicode

нужно было из X -> CHAR
в итоге написалась не большая роутина.

обратно думаю по анологии совсем не сложно сделать.
см. код. вдруг пригодится.:))

Code:
*&---------------------------------------------------------------------*
*&      Form  convert_from_x
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM convert_from_x  USING    p_xstring TYPE xstring
                     CHANGING p_value.

  DATA l_type        TYPE c.
  DATA l_x00         TYPE x VALUE '00'.
  DATA l_x20         TYPE x VALUE '20'.

* Convert From XString
  DATA lc_conv     TYPE REF TO cl_abap_conv_in_ce.
  DATA l_len       TYPE i.
  DATA l_xstring   TYPE xstring.

  DATA l_endia     TYPE abap_endia.

  l_xstring = p_xstring.

  DESCRIBE FIELD p_value TYPE l_type.

  l_endia = 'L'.

  IF l_type CA 'Cg'.
    REPLACE ALL OCCURRENCES OF l_x00 IN l_xstring WITH l_x20  IN BYTE MODE.

    l_endia = 'B'.
  ENDIF.


  CALL METHOD cl_abap_conv_in_ce=>create
    EXPORTING
      input       = l_xstring
      endian      = l_endia
      encoding    = '1504'
      replacement = space
      ignore_cerr = abap_true
    RECEIVING
      conv        = lc_conv.

  TRY.
      CALL METHOD lc_conv->read
        IMPORTING
          data = p_value
          len  = l_len.

*   Should ignore errors in code conversions
    CATCH cx_sy_conversion_codepage.
    CATCH cx_sy_codepage_converter_init.
    CATCH cx_parameter_invalid_type.
    CATCH cx_parameter_invalid_range.
  ENDTRY.

ENDFORM.                    " convert_from_x


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 07:15 
Специалист
Специалист

Зарегистрирован:
Пт, фев 16 2007, 09:49
Сообщения: 157
Спасибо большое!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 08:24 
Специалист
Специалист

Зарегистрирован:
Пт, фев 16 2007, 09:49
Сообщения: 157
А что означает?
IF l_type CA 'Cg'.
REPLACE ALL OCCURRENCES OF l_x00 IN l_xstring WITH l_x20 IN BYTE
MODE.

l_endia = 'B'.
ENDIF.

Выражение CA 'Cg' непонятно.
И для чего служить l_endia?
Насколько я понял, нулевые байты заменяются пробелами. Для чего?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 08:41 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
Damir написал(а):
А что означает?
IF l_type CA 'Cg'.
REPLACE ALL OCCURRENCES OF l_x00 IN l_xstring WITH l_x20 IN BYTE
MODE.

l_endia = 'B'.
ENDIF.

Выражение CA 'Cg' непонятно.
И для чего служить l_endia?
Насколько я понял, нулевые байты заменяются пробелами. Для чего?


на сколько я помню. (сейчас просто нету доступной выше чем 4.6, а класс cl_abap_conv_in_ce начинается только с 4.7) то

параметр endia указывает на последовательность считывания байтов. от старшего к младшему или на оборот.
т.к. в большенстве случаев (в моем случае было так). что числовые представления в X были записаны как раз от старшего в байта к младшему (в DBF файлах). поэтому это надо было отслеживать.

а выражение CA 'Cg' банально. если передаваемая переменная типа
'C' - (CHAR) или 'g' (то же какой то строковое, сейчас не помню). то считываем байты от младшего к старшему. для остальных наоборот. вот и все.

а вообще на сколько я помню все есть в хелпе как по describe feild
так и по классу cl_abap_conv_in_ce. вроде бы там все внятно.

а заменяем x00 на пробелы ... т.к. в строковых переменных x00 ты иначе как пробелами и не покажешь. ;))


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 08:58 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
вот добрался до хелпа.



Цитата:
Endian

Number format ( Byte order) in the input buffer. Caution: When converting, this parameter only works with types I, F, andINT2.

' ' (SPACE) Identical to the number format on the current application server.

'B' big-endian

'L' little-endian




Цитата:

Types:

g - String (STRING): Character string of variable length


C - CHAR.




Цитата:
CA (Contains Any):
c1 contains at least one character from the string c2.
If c1 or c2 is of type C, the comparison takes into account the full length of the field, including blanks at the end.
If c1 or c2 is of type STRING and empty, the result of the comparison is always negative.
If the result of the comparison is positive, the system field SY-FDPOS contains the offset of the first character in c1 which is also in c2.
If the result of the comparison is negative, the system field SY-FDPOS contains the length of c1.
The comparison is case-sensitive.



в общем хелп рулит :))


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, июл 03 2008, 14:32 
Специалист
Специалист

Зарегистрирован:
Пт, фев 16 2007, 09:49
Сообщения: 157
Вот тоже написал по аналогии, вдруг какому-нибудь начинающему абаперу пригодится )).
Форма преобразует строку в 16ричную строку:

FORM convert_from_c USING p_string TYPE string
CHANGING p_value.

DATA l_type TYPE c.
DATA lc_conv TYPE REF TO cl_abap_conv_out_ce.
DATA l_len TYPE i.
DATA l_string TYPE string.

DATA l_endia TYPE abap_endia.

l_string = p_string.
l_endia = 'B'.

CALL METHOD cl_abap_conv_out_ce=>create
EXPORTING
endian = l_endia
* encoding = '1100'
replacement = space
ignore_cerr = abap_true
RECEIVING
conv = lc_conv.
TRY.
CALL METHOD lc_conv->write
EXPORTING
data = l_string
IMPORTING
len = l_len.
* Should ignore errors in code conversions
CATCH cx_sy_conversion_codepage.
CATCH cx_sy_codepage_converter_init.
CATCH cx_parameter_invalid_type.
CATCH cx_parameter_invalid_range.
ENDTRY.
p_value = lc_conv->get_buffer( ).
ENDFORM.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB