Что такое код imap_utf7_decode

imap_utf7_decode

imap_utf7_decode — Decodes a modified UTF-7 encoded string

Описание

Decodes modified UTF-7 text into ISO-8859-1 string.

This function is needed to decode mailbox names that contain certain characters which are not in range of printable ASCII characters.

Список параметров

A modified UTF-7 encoding string, as defined in » RFC 2060, section 5.1.3 (original UTF-7 was defined in » RFC1642).

Возвращаемые значения

Returns a string that is encoded in ISO-8859-1 and consists of the same sequence of characters in text, or FALSE if text contains inval >text contains a character that is not part of ISO-8859-1 character set.

Смотрите также

  • imap_utf7_encode() — Converts ISO-8859-1 string to modified UTF-7 text

imap_utf7_decode

(PHP 4, PHP 5, PHP 7)

imap_utf7_decode — Декодирует строку из модифицированной кодировки UTF-7

Описание

Декодирует text из модифицированной кодировки UTF-7 в ISO-8859-1.

Это нужно для декодирования имен почтовых ящиков, содержащих в имени символы, не входящие в печатный диапазон ASCII.

Список параметров

Текст в модифицированной кодировке UTF-7, как определено в » RFC 2060, секция 5.1.3 (обычная UTF-7 описана в » RFC1642).

Возвращаемые значения

Возвращает строку в кодировке ISO-8859-1, которая содержит ту же последовательность символов, что и text , или FALSE , если text содержит некорректные символы или если text содержит символы не входящие в набор символов ISO-8859-1.

Смотрите также

  • imap_utf7_encode() — Преобразует строку ISO-8859-1 в модифицированную UTF-7

Что такое код imap_utf7_decode

(PHP 3>= 3.0.15, PHP 4 , PHP 5)

imap_utf7_decode — Decodes a modified UTF-7 encoded string

Description string imap_utf7_decode ( string text )

Decodes modified UTF-7 text into ISO-8859-1 string.

Returns a string that is encoded in ISO-8859-1 and consists of the same sequence of characters in text , or FALSE if text contains inval >text contains a character that is not part of ISO-8859-1 character set.

This function is needed to decode mailbox names that contain certain characters which are not in range of printable ASCII characters.

For «Outlook-style» UTF-7, you can also use:

mb_convert_encoding( $str, «ISO_8859-1», «UTF7-IMAP» ); # for decoding
mb_convert_encoding( $str, «UTF7-IMAP», «ISO_8859-1» ); # for encoding

FPublisher

Web-технологии: База знаний

Документация PHP

imap_utf7_decode

imap_utf7_decode — Decodes a modified UTF-7 encoded string

Описание

string imap_utf7_decode ( string $text )

Decodes modified UTF-7 text into ISO-8859-1 string.

This function is needed to decode mailbox names that contain certain characters which are not in range of printable ASCII characters.

Список параметров

A modified UTF-7 encoding string, as defined in » RFC 2060, section 5.1.3 (original UTF-7 was defined in » RFC1642).

Возвращаемые значения

Returns a string that is encoded in ISO-8859-1 and consists of the same sequence of characters in text , or FALSE if text contains inval >text contains a character that is not part of ISO-8859-1 character set.

Кодирование пути папки IMAP (IMAP UTF-7) для Python — python

Я хотел бы знать, существует ли какая-либо «официальная» функция/библиотека в Python для кодирования пути к папке IMAP4 UTF-7.

В imapInstance.list() я получаю следующий путь, кодируемый IMAP UTF-7:

Илон Маск рекомендует:  Что такое код odbc_fetch_object

Если я делаю следующую кодировку:

Что такое кодировка UTF-7, но не IMAP UTF-7. Test+AOk- вместо Test&AOk- Мне нужна официальная функция или библиотека, чтобы получить кодированную версию IMAP UTF-7.

    2 3
  • 22 окт 2020 2020-10-22 01:20:14
  • Mibou

3 ответа

Я написал очень простую реализацию python 3 IMAP UTF7, которая следует за спецификацией, и, похоже, она работает. ( «foorbarnnnrr» и многие другие обратные вызовы, & BdAF6QXkBdQ-, Test & Co, «[Mails].Test & AOk-» and

peter/mail/& ZeVnLIqe -/& U, BTFw- ведут себя так, как ожидалось).

Учитывая простоту этого кода, я устанавливаю его в общедоступном домене, поэтому не стесняйтесь использовать его, как хотите.

Кодировка пути к папке IMAP (IMAP UTF-7) для .NET?

Спецификация IMAP ( RFC 2060 , 5.1.3. Международное соглашение по присвоению имен почтовых ящиков) описывает, как обрабатывать символы не ASCII в именах папок. Он определяет модифицированную кодировку UTF-7:

По соглашению, имена международных почтовых ящиков указываются с использованием модифицированной версии кодировки UTF-7, описанной в [UTF-7]. Целью этих модификаций является исправление следующих проблем с UTF-7:

UTF-7 использует символ «+» для переключения; это противоречит общему использованию «+» в именах почтовых ящиков, в частности в именах групп новостей USENET.

Кодировка UTF-7 — BASE64, в которой используется символ «/»; это противоречит использованию «/» в качестве популярного разделителя иерархии.

UTF-7 запрещает незашифрованное использование «\»; это противоречит использованию «\» в качестве популярного разделителя иерархии.

UTF-7 запрещает незашифрованное использование «

«; это противоречит использованию «

» на некоторых серверах в качестве индикатора домашнего каталога.

UTF-7 позволяет нескольким альтернативным формам представлять одну и ту же строку; в частности, печатные символы US-ASCII могут быть представлены в закодированном виде.

В модифицированном UTF-7 печатаемые символы US-ASCII, за исключением символа «&», представляют себя; то есть символы со значениями октетов 0x20-0x25 и 0x27-0x7e. Символ «&» (0x26) представлен двухоктетной последовательностью «& -».

Все другие символы (значения октетов 0x00-0x1f, 0x7f-0xff и все 16-битные октеты Unicode) представлены в модифицированном BASE64 с дальнейшей модификацией из [UTF-7], в которой вместо символа «/» используется «,».
Модифицированный BASE64 НЕ ДОЛЖЕН использоваться для представления любого печатного символа US-ASCII, который может представлять себя.

«&» используется для перехода к модифицированному BASE64, а «-» для возврата к US-ASCII. Все имена начинаются с US-ASCII и ДОЛЖНЫ заканчиваться на US-ASCII (то есть имя, заканчивающееся 16-битным октетом Unicode, ДОЛЖНО заканчиваться на «-»).

Прежде чем я начну реализовывать это, мой вопрос: есть ли какой-нибудь код / библиотека .NET (или даже в рамках), который выполняет эту работу? Я не смог найти .NET ресурсы (только реализации для других языков / фреймворков ).

imap_utf7_decode

imap_utf7_decode — Decodes a modified UTF-7 encoded string

Описание

Decodes modified UTF-7 text into ISO-8859-1 string.

This function is needed to decode mailbox names that contain certain characters which are not in range of printable ASCII characters.

Список параметров

A modified UTF-7 encoding string, as defined in » RFC 2060, section 5.1.3 (original UTF-7 was defined in » RFC1642).

Возвращаемые значения

Returns a string that is encoded in ISO-8859-1 and consists of the same sequence of characters in text , or FALSE if text contains inval >text contains a character that is not part of ISO-8859-1 character set.

Смотрите также

  • imap_utf7_encode() — Converts ISO-8859-1 string to modified UTF-7 text

Коментарии

For «Outlook-style» UTF-7, you can also use:

mb_convert_encoding( $str, «ISO_8859-1», «UTF7-IMAP» ); # for decoding
mb_convert_encoding( $str, «UTF7-IMAP», «ISO_8859-1» ); # for encoding

For Chinese charset, we can use:

mb_convert_encoding($mailbox, «UTF7-IMAP», «GB2312»);

when you want to create a mailbox in Chinese.

mb_convert_encoding($mailbox, «GB2312», «UTF7-IMAP»);

when you want to show the listed mailbox with the right charset.

I can’t find method for converting imap utf7 into utf8.
So I have to write several lines of code to solve this issue. May be this could be usefull. Here is no error handling but it could be added.

Илон Маск рекомендует:  Что такое код xslt_set_base

Usage:
$imap_utf7 = ‘[Gmail]/&BBIEMAQ2BD0EPgQ1-‘;
$utf8 = ImapUtf7::decode($imap_utf7);
$imap_utf7_2 = ImapUtf7::encode($utf8);

[ImapUtf7.php]
class ImapUtf7 <
static $imap_base64 =
‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,’ ;
static private function encode_b64imap ( $s ) <
$a = 0 ; $al = 0 ; $res = » ; $n = strlen ( $s );
for( $i = 0 ; $i $n ; $i ++) <
$a =( $a 8 )| ord ( $s [ $i ]); $al += 8 ;
for(; $al >= 6 ; $al -= 6 ) $res .= self :: $imap_base64 [( $a >>( $al — 6 ))& 0x3F ];
>
if ( $al > 0 ) < $res .= self :: $imap_base64 [( $a 6 - $al ))& 0x3F ]; >
return $res ;
>
static private function encode_utf8_char ( $w ) <
if ( $w & 0x80000000 ) return » ;
if ( $w & 0xFC000000 ) $n = 5 ; else
if ( $w & 0xFFE00000 ) $n = 4 ; else
if ( $w & 0xFFFF0000 ) $n = 3 ; else
if ( $w & 0xFFFFF800 ) $n = 2 ; else
if ( $w & 0xFFFFFF80 ) $n = 1 ; else return chr ( $w );
$res = chr (( ( 255 7 — $n )) | ( $w >>( $n * 6 )) )& 255 );
while(— $n >= 0 ) $res .= chr ((( $w >>( $n * 6 ))& 0x3F )| 0x80 );
return $res ;
>
static private function decode_b64imap ( $s ) <
$a = 0 ; $al = 0 ; $res = » ; $n = strlen ( $s );
for( $i = 0 ; $i $n ; $i ++) <
$k = strpos ( self :: $imap_base64 , $s [ $i ]); if ( $k === FALSE ) continue;
$a =( $a 6 )| $k ; $al += 6 ;
if ( $al >= 8 ) < $res .= chr (( $a >>( $al — 8 ))& 255 ); $al -= 8 ; >
>
$r2 = » ; $n = strlen ( $res );
for( $i = 0 ; $i $n ; $i ++) <
$c = ord ( $res [ $i ]); $i ++;
if ( $i $n ) $c =( $c 8 ) | ord ( $res [ $i ]);
$r2 .= self :: encode_utf8_char ( $c );
>
return $r2 ;
>
static function encode ( $s ) <
$n = strlen ( $s ); $err = 0 ; $buf = » ; $res = » ;
for( $i = 0 ; $i $n ;) <
$x = ord ( $s [ $i ++]);
if (( $x & 0x80 )== 0x00 ) < $r = $x ; $w = 0 ; >
else if (( $x & 0xE0 )== 0xC0 ) < $w = 1 ; $r = $x & 0x1F ; >
else if (( $x & 0xF0 )== 0xE0 ) < $w = 2 ; $r = $x & 0x0F ; >
else if (( $x & 0xF8 )== 0xF0 ) < $w = 3 ; $r = $x & 0x07 ; >
else if (( $x & 0xFC )== 0xF8 ) < $w = 4 ; $r = $x & 0x03 ; >
else if (( $x & 0xFE )== 0xFC ) < $w = 5 ; $r = $x & 0x01 ; >
else if (( $x & 0xC0 )== 0x80 ) < $w = 0 ; $r =- 1 ; $err ++; >
else < $w = 0 ; $r =- 2 ; $err ++; >
for( $k = 0 ; $k $w && $i $n ; $k ++) <
$x = ord ( $s [ $i ++]); if ( $x & 0xE0 != 0x80 ) < $err ++; >
$r =( $r 6 )|( $x & 0x3F );
>
if ( $r 0x20 || $r > 0x7E ) <
$buf .= chr (( $r >> 8 )& 0xFF ); $buf .= chr ( $r & 0xFF );
> else <
if ( strlen ( $buf )) <
$res .= ‘&’ . self :: encode_b64imap ( $buf ). ‘-‘ ;
$buf = » ;
>
if ( $r == 0x26 ) < $res .= '&-' ; >else $res .= chr ( $r );
>
>
if ( strlen ( $buf )) $res .= ‘&’ . self :: encode_b64imap ( $buf ). ‘-‘ ;
return $res ;
>
static function decode ( $s ) <
$res = » ; $n = strlen ( $s ); $h = 0 ;
while( $h $n ) <
$t = strpos ( $s , ‘&’ , $h ); if ( $t === false ) $t = $n ;
$res .= substr ( $s , $h , $t — $h ); $h = $t + 1 ; if ( $h >= $n ) break;
$t = strpos ( $s , ‘-‘ , $h ); if ( $t === false ) $t = $n ;
$k = $t — $h ;
if ( $k == 0 ) $res .= ‘&’ ;
else $res .= self :: decode_b64imap ( substr ( $s , $h , $k ));
$h = $t + 1 ;
>
return $res ;
>
>

Илон Маск рекомендует:  Что такое код ncurses_scr_dump

IMAP folder path encoding (IMAP UTF-7) for Python

I would like to know if any «official» function/library existed in Python for IMAP4 UTF-7 folder path encoding.

In the imapInstance.list() I get the following path IMAP UTF-7 encoded :

If I do the following encoding :

Which is UTF-7 but not IMAP UTF-7 encoded. Test+AOk- instead of Test&AOk- I’d need an official function or library to get the IMAP UTF-7 encoded version.

4 Answers 4

The IMAPClient package has functionality for encoding and decoding using IMAP’s modified UTF-7. Have a look in the IMAPClient.imap_utf7 module. This module could be used standalone or you could just use IMAPClient which handles doing the encoding and decoding of folder names transparently.

Example code:

The imapclient implementation is kind of broken though:

After some research I found an implementation in MailPile which does not fail at roundtrip encoding on this test. I also ported it to Python3 if you’re interested: https://github.com/MarechJ/py3_imap_utf7

I wrote a very simple IMAP UTF7 python 3 implementation which follows the specification, and it seems to work. («foo\rbar\n\n\n\r\r» and many other roundtrips, ‘&BdAF6QXkBdQ-‘, ‘Test&Co’, «[Mails].Test&AOk-» and ‘

peter/mail/&ZeVnLIqe-/&U,BTFw-‘ behave as expected).

Given the simplicity of this code, I set it in the public domain, so feel free to use it as you want.

Not the answer you’re looking for? Browse other questions tagged python encoding imap utf-7 or ask your own question.

Linked

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.12.35412

Кодирование путь к папке IMAP (IMAP UTF-7) для .NET?

Спецификация IMAP ( RFC 2 060 , 5.1.3 Mailbox Международной конвенции именования.) Описывает , как обращаться с не-ASCII символов в именах папок. Он определяет модифицированный кодировку UTF-7:

По соглашению, международные названия почтовых ящиков задаются с помощью модифицированного варианта кодировки UTF-7, описанной в [UTF-7]. Цель этих модификаций, чтобы исправить следующие проблемы с UTF-7:

UTF-7 использует знак «+» для смещения; это вступает в противоречие с обычным использованием «+» в именах почтовых ящиков, в частности, имена групп новостей USENET.

Кодировка UTF-7 является BASE64, который использует символ «/»; это конфликтует с использованием в качестве популярного разделителя «/» иерархии.

UTF-7 запрещает Unencoded использование \; это конфликтует с использованием «\» в качестве разделителя популярной иерархии.

UTF-7 запрещает незакодированное использование «

»; это конфликтует с использованием «

» в некоторых серверах в качестве индикатора домашнего каталога.

UTF-7 допускает множество альтернативных форм для представления той же строки; в частности, для печати US-ASCII chararacters может быть представлена ​​в закодированной форме.

В модифицированной UTF-7, печатные символы US-ASCII за исключением & представляют из себя; то есть символы с октета значения 0x20-0x25 и 0x27-0x7e. Символ «&» (0x26) представлена ​​последовательностью из двух октетов «& -».

Все остальные символы (октет значения 0x00-0x1f, 0x7F-0xff, и все Unicode 16-битных октетов) представлены в модифицированной BASE64, с дальнейшей модификации из [UTF-7] , что «» используется вместо „/“.
Модифицированная BASE64 недопустимо использовать для представления любой печати US-ASCII символов , которые могут представлять собой.

«&» Используется для перехода к модифицированному BASE64 и «-», чтобы перейти назад к US-ASCII. Все имена начинаются в US-ASCII и должны заканчиваться в US-ASCII (то есть имя, которое заканчивается с Unicode 16-битного октет должен заканчиваться «-»).

Прежде чем я начну ее реализацию, на мой вопрос: есть ли какая — нибудь .NET код / библиотека там (или даже в рамках) , что делает работу? Я не мог найти .NET ресурсов (только реализации для других языков / рамок ).

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL