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からデータを落としたいだけなのですが、誰かご存知の場合は教えてださい。よろしくお願いいたします。
^ を使用しているのが原因だと思います。
URIエスケープして URLWithString を呼出せば解決しま
す。
On 2007/04/02, at 19:01, Caz wrote:
> 吉川です。
>
> NSURL の生成で壁にぶち当たってしまいました。同様な経験を体験し
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
もうちょっと補足、
CFURLCreateStringByAddingPercentEscapes()
を使うと簡単に URIエスケープができます(Cocoa に相
当する API がない?)
CoreFoundation ですが Toll-free bridge なのでキャ
ストすれば Cocoa の
NSString * に対しても使えます。
温井さん、木村さん、ありがとうございます。エスケープはちらっと思ったのですが、
':', '/', '%', '#', ';', '@' だけだと勘違いしてしまいました。
さっそく、試してみたいと思います。
ひさびさの書き込み、うれしいです。(^^)
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
07/04/03 に Makoto Nukui<gn...@so-kukan.com> さんは書きました:
> CFURLCreateStringByAddingPercentEscapes()
>
> を使うと簡単に URIエスケープができます(Cocoa に相
> 当する API がない?)
NSStringの
stringByAddingPercentEscapesUsingEncoding:
ですかね?
On 2007/04/03, at 15:27, satoshi oomori wrote:
> stringByAddingPercentEscapesUsingEncoding:
おお、そういうのが NSURL にあったんですね。(^^;
縦書きをしたいと思っているのですが、縦書きのグリフに変換するため
にCMapファイルのような変換テーブルがないかと思っています。
アドビのとかだと
/Library/Application\ Support/Adobe/fonts/Reqrd/CMaps/
にあるのですが、PostScriptで書かれていてなかなか敷居が高い
です。
キャラクタコードからグリフコードまでは得られているので、縦書きの
際のグリフコードのみ変換がいります。
たとえば"「"っていう文字だと横書きだとグリフコードが
686なのですが縦書きのグリフだと 12133を使う必要があります。
そういった関数、メソッドをご存知ではないでしょうか?
#なんか、新規ディスカッションにならないなあ
「新しいディスカッションを開始」で投稿しても、このスレッドについてしまいますが、やり方が悪い?