NSURL が作れないケース

249 views
Skip to first unread message

Caz

unread,
Apr 2, 2007, 6:01:28 AM4/2/07
to cocoa-dev-japan
吉川です。

NSURL の生成で壁にぶち当たってしまいました。同様な経験を体験した事がある人はいませんか?

NSURL* url = [NSSTRL URLWithString:@"http://ichart.finance.yahoo.com/"
"table.csv?s=^XAX&d=0&e=1&f=2050&g=d&a=0&b=1&c=1900&ignore=.csv"];

↑実際は1行です。

を呼び出すと、nil が帰ってきます。しかたがないので、base と relative に分割して

NSURL* base = [NSURL URLWithString:@"http://
ichart.finance.yahoo.com/"];
NSURL* url = [NSURL URLWithString:@"table.csv?
s=^XAX&d=0&e=1&f=2050&g=d&a=0&b=1&c=1900 &ignore=.csv"
relativeToURL:base];

としても、nil が帰ってきてしまいます。

Safari にこのアドレスを入れてもちゃんと動作するので、確認はしていませんが、takeStringURLFrom ではうまくいくようです。
特定のURLからデータを落としたいだけなのですが、誰かご存知の場合は教えてださい。よろしくお願いいたします。

Makoto Nukui

unread,
Apr 2, 2007, 7:50:29 AM4/2/07
to cocoa-d...@googlegroups.com
温井です。


 ^ を使用しているのが原因だと思います。
 URIエスケープして URLWithString を呼出せば解決しま
す。


On 2007/04/02, at 19:01, Caz wrote:
> 吉川です。
>
> NSURL の生成で壁にぶち当たってしまいました。同様な経験を体験し

kimura wataru

unread,
Apr 2, 2007, 10:56:02 AM4/2/07
to cocoa-d...@googlegroups.com
木村といいます。ついでに補足。

URIの形式を定義した、RFC2396の2.4.3 Excluded US-ASCII Charactersにおいて

{ } | \ ^ [ ] `

が利用できない文字として定義されています。

http://www.ietf.org/rfc/rfc2396.txt
http://hp.vector.co.jp/authors/VA014833/rfc2396J.html (日本語訳)

Safari/WebKitにRFC2396を完全には満たさないURLを渡しても動作するのは、
内部的に利用できない文字をエスケープしているためです。WebKitのソースコード、
WebKit/Misc/WebNSURLExtras.[hm]で実際にどういった処理を行っているかを
確認することができます。
#けっこー地道な処理です


On Mon, 2 Apr 2007 20:50:29 +0900, Makoto Nukui wrote:
>
> 温井です。
>
>
>  ^ を使用しているのが原因だと思います。
>  URIエスケープして URLWithString を呼出せば解決しま
> す。
>
>
> On 2007/04/02, at 19:01, Caz wrote:
>> 吉川です。
>>
>> NSURL の生成で壁にぶち当たってしまいました。同様な経験を体験し
>> た事がある人はいませんか?
>>
>> NSURL* url = [NSSTRL URLWithString:@"http://ichart.finance.yahoo.com/"
>> "table.csv?s=^XAX&d=0&e=1&f=2050&g=d&a=0&b=1&c=1900&ignore=.csv"];
>>
>> ↑実際は1行です。
>>

--
kimura wataru

Makoto Nukui

unread,
Apr 2, 2007, 11:57:50 AM4/2/07
to cocoa-d...@googlegroups.com
温井です。


 もうちょっと補足、

  CFURLCreateStringByAddingPercentEscapes()

 を使うと簡単に URIエスケープができます(Cocoa に相
当する API がない?)
 CoreFoundation ですが Toll-free bridge なのでキャ
ストすれば Cocoa の
 NSString * に対しても使えます。

Kaz Yoshikawa

unread,
Apr 2, 2007, 12:25:17 PM4/2/07
to cocoa-d...@googlegroups.com, Makoto Nukui
吉川です。

温井さん、木村さん、ありがとうございます。エスケープはちらっと思ったのですが、
':', '/', '%', '#', ';', '@' だけだと勘違いしてしまいました。

さっそく、試してみたいと思います。

慧 松本

unread,
Apr 2, 2007, 8:21:15 PM4/2/07
to cocoa-d...@googlegroups.com
松本です。

ひさびさの書き込み、うれしいです。(^^)

On 2007/04/03, at 1:25, Kaz Yoshikawa wrote:
> 温井さん、木村さん、ありがとうございます。エスケープはちらっと

> 思ったのですが、
> ':', '/', '%', '#', ';', '@' だけだと勘違いしてしまいました。
> さっそく、試してみたいと思います。

以下は拙作のURL文字列を変換するNSStringの拡張
Methodです。" <>[]^`|{}\\" の安全でない文字
や文字列のなかにある日本語などを指定のエンコーディング(たとえば
UTF-8)で、%付16進文字
列に変換します。

参考になれば幸いです。

(拙作のJChecker XというHTMLチェッカで、安全でない
URL文字列を検出したときに、自動修正
するときに使用しているMethodです。)

- (NSString *)URLStringInEncoding:(NSStringEncoding)encoding
lineEndings:(int)lfType
{
NSData *data = [self dataUsingEncoding:encoding
allowLossyConversion:YES];

unsigned char *ptr = (unsigned char *)[data bytes];
unsigned char *maxPtr = ptr + [data length];
unsigned char *buffer = malloc([data length]*5);
unsigned char *target = buffer;
char *hexChars = "0123456789ABCDEF";
char *unsafechars = " <>[]^`|{}\\";
int targetLen=0;
id retObject;

while( ptr < maxPtr )
{
if( *ptr < 0x20 || strchr( unsafechars, *ptr ) || *ptr >= 0x7f )
{
if( *ptr == '\n' && lfType != kUnixLFType )
{
*target++ = '%';
*target++ = hexChars[ '\r' / 16 ];
*target++ = hexChars[ '\r' % 16 ];
targetLen +=3;

if( lfType == kDosLFType )
{
*target++ = '%';
*target++ = hexChars[ '\n' / 16 ];
*target++ = hexChars[ '\n' % 16 ];
targetLen +=3;
}
}
else
{
*target++ = '%';
*target++ = hexChars[ *ptr / 16 ];
*target++ = hexChars[ *ptr % 16 ];
targetLen +=3;
}
}
else
{
*target++ = *ptr;
targetLen ++;
}
ptr ++;
}

*target = '\0';

retObject = [NSString stringWithCString:(char *)buffer];
free(buffer);

return retObject;
}

-----------------------------------------------------
Satoshi Matsumoto <sat...@mac.com>
816-5 Odake, Odawara, Kanagawa, Japan 256-0802


satoshi oomori

unread,
Apr 3, 2007, 2:27:47 AM4/3/07
to cocoa-d...@googlegroups.com
大森です。

07/04/03 に Makoto Nukui<gn...@so-kukan.com> さんは書きました:


> CFURLCreateStringByAddingPercentEscapes()
>
> を使うと簡単に URIエスケープができます(Cocoa に相
> 当する API がない?)

NSStringの
stringByAddingPercentEscapesUsingEncoding:
ですかね?

慧 松本

unread,
Apr 3, 2007, 3:35:17 AM4/3/07
to cocoa-d...@googlegroups.com
松本です。

On 2007/04/03, at 15:27, satoshi oomori wrote:
> stringByAddingPercentEscapesUsingEncoding:

おお、そういうのが NSURL にあったんですね。(^^;

Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

おおもり

unread,
Apr 4, 2007, 7:55:17 PM4/4/07
to cocoa-dev-japan
大森です。

縦書きをしたいと思っているのですが、縦書きのグリフに変換するため
にCMapファイルのような変換テーブルがないかと思っています。
アドビのとかだと
/Library/Application\ Support/Adobe/fonts/Reqrd/CMaps/
にあるのですが、PostScriptで書かれていてなかなか敷居が高い
です。
キャラクタコードからグリフコードまでは得られているので、縦書きの
際のグリフコードのみ変換がいります。

たとえば"「"っていう文字だと横書きだとグリフコードが
686なのですが縦書きのグリフだと 12133を使う必要があります。

そういった関数、メソッドをご存知ではないでしょうか?

#なんか、新規ディスカッションにならないなあ

おおもり

unread,
Apr 4, 2007, 8:00:38 PM4/4/07
to cocoa-dev-japan
すいません、件名変えてしまいました。戻します。

「新しいディスカッションを開始」で投稿しても、このスレッドについてしまいますが、やり方が悪い?

Reply all
Reply to author
Forward
0 new messages