UTF7-IMAP(modified UTF-7)

UTF7-IMAPが正しい表記かはまだ調べてないけど修正UTF-7ともいう
RFC2060の原文読んだら「modified UTF-7」なので修正UTF-7が正しい.
UTF7-IMAPはmbstring用語.

先日調べたところいまだiconvがサポートしていないのが意外.ホントにサポートしてない?

$ iconv --version
iconv (GNU libc) 2.4
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Ulrich Drepper.
$ iconv -l|grep -i UTF
ISO-10646/UTF-8/
ISO-10646/UTF8/
UTF-7//
UTF-8//
UTF-16//
UTF-16BE//
UTF-16LE//
UTF-32//
UTF-32BE//
UTF-32LE//
UTF7//
UTF8//
UTF16//
UTF16BE//
UTF16LE//
UTF32//
UTF32BE//
UTF32LE//

と疑心暗鬼風に書いてるけどiconvはとても厳格なので,IANAで正しく定義されていないとかで蹴られている予感.

5.1.3. メールボックスの国際的な命名規則

習慣により、国際的なメールボックス名は、[UTF-7] で述べられている UTF-7 符号化の修正版を用いて指定される。これらの修正の目的は、UTF-7 での次の問題を訂正するためである。

1)
UTF-7 は、シフトするために、文字 "+" を用い、これは、メールボックス名、 特にUSENETニュースグループ名での "+" のありふれた使用と衝突する。
2)
UTF-7 の符号化は、文字 "/" を用いる BASE64である; これは、一般的な階層区切りとしての "/" の使用と衝突する。
3)
UTF-7 は、符号化されない "\" の使用を禁じている; これは、一般的な階層区切りとしての "\" の使用と衝突する。
4)
UTF-7 は、符号化されない "~" の使用を禁じている; これは、いくつかのサーバでホームディレクトリを示すものとしての "~" の使用と衝突する。
5)
UTF-7 は、同じ文字列を表現するための、複数の別の形式を許している; 特に、印字可能な US-ASCII 文字が符号化形式で表現され得る。

修正 UTF-7 では、印字可能な US-ASCII 文字は、"&" を除いて、 それら自身を表す; つまり、オクテット値 0x20-0x25 と 0x27-0x7e の文字である。文字 "&" (0x26) は、2オクテットの連続 "&-" で表現される。

すみません.日本語が難しいです(照
とりあえずまず7bitだけ適当に見てみる.
ってことでようするに

UTF-7=>[0-9a-zA-Z '(),-\./:?]意外は開始文字「+」+BASE64+終端文字「-」
UTF7-IMAP=>[0-9a-zA-Z -%'-~]意外「&」は「&-」,その他開始文字「&」+BASE64+終端文字「-」

UTF7-IMAPの方がシンプルに見える..

UTF-7

$ php -r 'for ( $i = 0x00; $i < 0x7F; $i++) { printf( "%02XH:%c:%s\n", $i, $i, mb_convert_encoding( sprintf( "%c", $i), "UTF-7", "ASCII"));}'
00H::
01H::+AAE-
02H::+AAI-
03H::+AAM-
04H::+AAQ-
05H::+AAU-
06H::+AAY-
07H::+AAc-
08H:+AAg-
09H:    :       
0AH:
:

0BH:
    :+AAs-
0CH::+AAw-
DH
0EH::+AA4- 0FH::+AA8- 10H::+ABA- 11H::+ABE- 12H::+ABI- 13H::+ABM- 14H::+ABQ- 15H::+ABU- 16H::+ABY- 17H::+ABc- 18H::+ABg- 19H::+ABk- 1AH::+ABo- 1BH:Bs- 1CH::+ABw- 1DH::+AB0- 1EH::+AB4- 1FH::+AB8- 20H: : 21H:!:+ACE- 22H:":+ACI- 23H:#:+ACM- 24H:$:+ACQ- 25H:%:+ACU- 26H:&:+ACY- 27H:':' 28H:(:( 29H:):) 2AH:*:+ACo- 2BH:+:+ACs- 2CH:,:, 2DH:-:- 2EH:.:. 2FH:/:/ 30H:0:0 31H:1:1 32H:2:2 33H:3:3 34H:4:4 35H:5:5 36H:6:6 37H:7:7 38H:8:8 39H:9:9 3AH:::: 3BH:;:+ADs- 3CH:<:+ADw- 3DH:=:+AD0- 3EH:>:+AD4- 3FH:?:? 40H:@:+AEA- 41H:A:A 42H:B:B 43H:C:C 44H:D:D 45H:E:E 46H:F:F 47H:G:G 48H:H:H 49H:I:I 4AH:J:J 4BH:K:K 4CH:L:L 4DH:M:M 4EH:N:N 4FH:O:O 50H:P:P 51H:Q:Q 52H:R:R 53H:S:S 54H:T:T 55H:U:U 56H:V:V 57H:W:W 58H:X:X 59H:Y:Y 5AH:Z:Z 5BH:[:+AFs- 5CH:\:+AFw- 5DH:]:+AF0- 5EH:^:+AF4- 5FH:_:+AF8- 60H:`:+AGA- 61H:a:a 62H:b:b 63H:c:c 64H:d:d 65H:e:e 66H:f:f 67H:g:g 68H:h:h 69H:i:i 6AH:j:j 6BH:k:k 6CH:l:l 6DH:m:m 6EH:n:n 6FH:o:o 70H:p:p 71H:q:q 72H:r:r 73H:s:s 74H:t:t 75H:u:u 76H:v:v 77H:w:w 78H:x:x 79H:y:y 7AH:z:z 7BH:{:+AHs- 7CH:|:+AHw- 7DH:}:+AH0- 7EH:~:+AH4- 7FH::+AH8-

UTF7-IMAP

$ php -r 'for ( $i = 0x00; $i < 0x7F; $i++) { printf( "%02XH:%c:%s\n", $i, $i, mb_convert_encoding( sprintf( "%c", $i), "UTF7-IMAP", "ASCII"));}'
00H::
01H::&AAE-
02H::&AAI-
03H::&AAM-
04H::&AAQ-
05H::&AAU-
06H::&AAY-
07H::&AAc-
08H:&AAg-
09H:    :&AAk-
0AH:
:&AAo-
0BH:
    :&AAs-
0CH::&AAw-
:&AA0-
0EH::&AA4-
0FH::&AA8-
10H::&ABA-
11H::&ABE-
12H::&ABI-
13H::&ABM-
14H::&ABQ-
15H::&ABU-
16H::&ABY-
17H::&ABc-
18H::&ABg-
19H::&ABk-
1AH::&ABo-
1BH:Bs-
1CH::&ABw-
1DH::&AB0-
1EH::&AB4-
1FH::&AB8-
20H: : 
21H:!:!
22H:":"
23H:#:#
24H:$:$
25H:%:%
26H:&:&-
27H:':'
28H:(:(
29H:):)
2AH:*:*
2BH:+:+
2CH:,:,
2DH:-:-
2EH:.:.
2FH:/:/
30H:0:0
31H:1:1
32H:2:2
33H:3:3
34H:4:4
35H:5:5
36H:6:6
37H:7:7
38H:8:8
39H:9:9
3AH::::
3BH:;:;
3CH:<:<
3DH:=:=
3EH:>:>
3FH:?:?
40H:@:@
41H:A:A
42H:B:B
43H:C:C
44H:D:D
45H:E:E
46H:F:F
47H:G:G
48H:H:H
49H:I:I
4AH:J:J
4BH:K:K
4CH:L:L
4DH:M:M
4EH:N:N
4FH:O:O
50H:P:P
51H:Q:Q
52H:R:R
53H:S:S
54H:T:T
55H:U:U
56H:V:V
57H:W:W
58H:X:X
59H:Y:Y
5AH:Z:Z
5BH:[:[
5CH:\:\
5DH:]:]
5EH:^:^
5FH:_:_
60H:`:`
61H:a:a
62H:b:b
63H:c:c
64H:d:d
65H:e:e
66H:f:f
67H:g:g
68H:h:h
69H:i:i
6AH:j:j
6BH:k:k
6CH:l:l
6DH:m:m
6EH:n:n
6FH:o:o
70H:p:p
71H:q:q
72H:r:r
73H:s:s
74H:t:t
75H:u:u
76H:v:v
77H:w:w
78H:x:x
79H:y:y
7AH:z:z
7BH:{:{
7CH:|:|
7DH:}:}
7EH:~:~
7FH::&AH8-