2015-07-26 3 views
1

Проблема начинается, когда я натыкаюсь на символы Юникода. Например, árbol. Прямо сейчас я справиться с этим, спрашивая, если символ в позиции i, то есть string (i:i) меньше 127. Это означает, что он принадлежит к таблице ASCII, с этим я точно знаю, что string (i:i) является полный одиночный символ , В другом случае (>= 127) и для моего примера «árbol», string (1,2) - полный символ.Извлечение одного символа Юникода из строки

Я думаю, что способ обработки строк решает проблему в моих практических целях (обработка файлов на испанском, польском и русском языках), но в случае обработки китайского письма, где символы могут занимать до 4 байт, тогда я будет иметь проблемы.

Есть ли способ в fortran выделить символы Unicode внутри строки?

+0

Поддерживает ли ваш процессор Fortran тип символа ISO 10646 (т. Е. UCS-4)? Если это так, и вы используете этот характер, то ссылка на один символ - тривиальная операция. – IanH

+0

предположим, что он поддерживает, как я могу ссылаться на один символ. Это связано с использованием модуля ISO_FORTRAN_ENV – puillitoto

+1

'string (i: i)' (я сказал, что это было тривиально!) С характером символа ISO 10646 каждый символ в строке представляет собой кодовую точку юникода. Значение, используемое для типа символа для ISO 10646, может быть получено с использованием встроенного 'SELECTED_CHAR_KIND'. – IanH

ответ

1

gfortran в настоящее время не поддерживает символы, отличные от ASCII, в кодированных файлах UTF-8, см. here. Вы можете найти соответствующий bug report here.

Как обход, вы можете указать символ юникода в шестнадцатеричном формате: char(int(z'00E1'), ucs4), или '\u00E1'. Последнее требует опции компиляции -fbackslash, чтобы включить оценку обратной косой черты.

program character_kind 
    use iso_fortran_env 
    implicit none 
    integer, parameter :: ucs4 = selected_char_kind ('ISO_10646') 

    character(kind=ucs4, len=20) :: string 

! string = ucs4_'árbol' ! This does not work 
! string = char(int(z'00E1'), ucs4) // ucs4_'rbol' ! This works 
    string = ucs4_'\u00E1rbol' ! This is also working 

    open (output_unit, encoding='UTF-8') 

    print *, string(1:1) 
    print *, string 

end program character_kind 

ifort, кажется, не поддерживает ISO_10646 на всех, selected_char_kind ('ISO_10646') возвращается -1. С ifort 15.0.0 Я получаю то же сообщение, что описано here.

Смежные вопросы