mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 16:50:58 +00:00
Some encoding fixes for strings.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@9563 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
9f5d519eca
commit
6ad0dbad23
4 changed files with 109 additions and 53 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2001-04-12 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
* Source/NSString.m: For efficiency, use _DefaultStringEncoding
|
||||||
|
throughout, rather than calling +defaultCStringEncoding. This is
|
||||||
|
safe since the documentation explicitly states that the encoding
|
||||||
|
cannot be changed programmatically ... so we don't have to worry
|
||||||
|
about someone adding a category to change that.
|
||||||
|
When converting data to/from strings, optimise to simple cString
|
||||||
|
stuff if the specified encoding is the defautl encoding.
|
||||||
|
Tidied some stuff to conform better to coding standards.
|
||||||
|
* Source/Unicode.m GetDefEncoding(): prohibit UTF8 from being the
|
||||||
|
default cString encoding ... the default cString encoding must
|
||||||
|
consist of 7 or 8 bit characters, and must contain ASCII as a
|
||||||
|
subset. We really should think of a generalised test for that.
|
||||||
|
|
||||||
2001-04-11 Nicola Pero <nicola@brainstorm.co.uk>
|
2001-04-11 Nicola Pero <nicola@brainstorm.co.uk>
|
||||||
|
|
||||||
* Source/NSString.m ([-initWithData:encoding:]): When working with
|
* Source/NSString.m ([-initWithData:encoding:]): When working with
|
||||||
|
|
|
@ -167,6 +167,22 @@
|
||||||
<p>
|
<p>
|
||||||
|
|
||||||
Returns the encoding used for any method accepting a C string.
|
Returns the encoding used for any method accepting a C string.
|
||||||
|
This value is determined automatically from the programs
|
||||||
|
environment and cannot be changed programmatically.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
You should <em>NOT</em> override this method in an attempt to
|
||||||
|
change the encoding being used.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
In GNUstep, this encoding is determined by the initial value
|
||||||
|
of the <code>GNUSTEP_STRING_ENCODING</code> environment
|
||||||
|
variable. If this is not defined,
|
||||||
|
<code>NSISOLatin1StringEncoding</code> is assumed.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -229,8 +229,8 @@ pathSepMember(unichar c)
|
||||||
static inline gsu32
|
static inline gsu32
|
||||||
surrogatePairValue(unichar high, unichar low)
|
surrogatePairValue(unichar high, unichar low)
|
||||||
{
|
{
|
||||||
return ((high - (unichar)0xD800) * (unichar)400) +
|
return ((high - (unichar)0xD800) * (unichar)400)
|
||||||
((low - (unichar)0xDC00) + (unichar)10000);
|
+ ((low - (unichar)0xDC00) + (unichar)10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1021,7 +1021,8 @@ handle_printf_atsign (FILE *stream,
|
||||||
- (id) initWithData: (NSData*)data
|
- (id) initWithData: (NSData*)data
|
||||||
encoding: (NSStringEncoding)encoding
|
encoding: (NSStringEncoding)encoding
|
||||||
{
|
{
|
||||||
if (encoding == NSASCIIStringEncoding)
|
if (encoding == NSASCIIStringEncoding
|
||||||
|
|| encoding == _DefaultStringEncoding)
|
||||||
{
|
{
|
||||||
unsigned len = [data length];
|
unsigned len = [data length];
|
||||||
|
|
||||||
|
@ -1126,14 +1127,14 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
test = [d bytes];
|
test = [d bytes];
|
||||||
if ((test != NULL) && (len > 1)
|
if ((test != NULL) && (len > 1)
|
||||||
&& ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped)))
|
&& ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped)))
|
||||||
{
|
{
|
||||||
/* somebody set up us the BOM! */
|
/* somebody set up us the BOM! */
|
||||||
enc = NSUnicodeStringEncoding;
|
enc = NSUnicodeStringEncoding;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
enc = [NSString defaultCStringEncoding];
|
enc = _DefaultStringEncoding;
|
||||||
}
|
}
|
||||||
return [self initWithData: d encoding: enc];
|
return [self initWithData: d encoding: enc];
|
||||||
}
|
}
|
||||||
|
@ -1153,13 +1154,13 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
test = [d bytes];
|
test = [d bytes];
|
||||||
if ((test != NULL) && (len > 1)
|
if ((test != NULL) && (len > 1)
|
||||||
&& ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped)))
|
&& ((test[0] == byteOrderMark) || (test[0] == byteOrderMarkSwapped)))
|
||||||
{
|
{
|
||||||
enc = NSUnicodeStringEncoding;
|
enc = NSUnicodeStringEncoding;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
enc = [NSString defaultCStringEncoding];
|
enc = _DefaultStringEncoding;
|
||||||
}
|
}
|
||||||
return [self initWithData: d encoding: enc];
|
return [self initWithData: d encoding: enc];
|
||||||
}
|
}
|
||||||
|
@ -1215,11 +1216,12 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
- (NSString*) stringByAppendingFormat: (NSString*)format,...
|
- (NSString*) stringByAppendingFormat: (NSString*)format,...
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
id ret;
|
id ret;
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
ret = [self stringByAppendingString:
|
ret = [self stringByAppendingString:
|
||||||
[NSString stringWithFormat: format arguments: ap]];
|
[NSString stringWithFormat: format arguments: ap]];
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1243,26 +1245,27 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
- (NSArray*) componentsSeparatedByString: (NSString*)separator
|
- (NSArray*) componentsSeparatedByString: (NSString*)separator
|
||||||
{
|
{
|
||||||
NSRange search, complete;
|
NSRange search;
|
||||||
NSRange found;
|
NSRange complete;
|
||||||
|
NSRange found;
|
||||||
NSMutableArray *array = [NSMutableArray array];
|
NSMutableArray *array = [NSMutableArray array];
|
||||||
|
|
||||||
search = NSMakeRange (0, [self length]);
|
search = NSMakeRange (0, [self length]);
|
||||||
complete = search;
|
complete = search;
|
||||||
found = [self rangeOfString: separator];
|
found = [self rangeOfString: separator];
|
||||||
while (found.length)
|
while (found.length != 0)
|
||||||
{
|
{
|
||||||
NSRange current;
|
NSRange current;
|
||||||
|
|
||||||
current = NSMakeRange (search.location,
|
current = NSMakeRange (search.location,
|
||||||
found.location - search.location);
|
found.location - search.location);
|
||||||
[array addObject: [self substringWithRange: current]];
|
[array addObject: [self substringWithRange: current]];
|
||||||
|
|
||||||
search = NSMakeRange (found.location + found.length,
|
search = NSMakeRange (found.location + found.length,
|
||||||
complete.length - found.location - found.length);
|
complete.length - found.location - found.length);
|
||||||
found = [self rangeOfString: separator
|
found = [self rangeOfString: separator
|
||||||
options: 0
|
options: 0
|
||||||
range: search];
|
range: search];
|
||||||
}
|
}
|
||||||
// Add the last search string range
|
// Add the last search string range
|
||||||
[array addObject: [self substringWithRange: search]];
|
[array addObject: [self substringWithRange: search]];
|
||||||
|
@ -1308,18 +1311,20 @@ handle_printf_atsign (FILE *stream,
|
||||||
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
|
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
|
||||||
{
|
{
|
||||||
NSRange all = NSMakeRange(0, [self length]);
|
NSRange all = NSMakeRange(0, [self length]);
|
||||||
|
|
||||||
return [self rangeOfCharacterFromSet: aSet
|
return [self rangeOfCharacterFromSet: aSet
|
||||||
options: 0
|
options: 0
|
||||||
range: all];
|
range: all];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
|
- (NSRange) rangeOfCharacterFromSet: (NSCharacterSet*)aSet
|
||||||
options: (unsigned)mask
|
options: (unsigned)mask
|
||||||
{
|
{
|
||||||
NSRange all = NSMakeRange(0, [self length]);
|
NSRange all = NSMakeRange(0, [self length]);
|
||||||
|
|
||||||
return [self rangeOfCharacterFromSet: aSet
|
return [self rangeOfCharacterFromSet: aSet
|
||||||
options: mask
|
options: mask
|
||||||
range: all];
|
range: all];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* xxx FIXME */
|
/* xxx FIXME */
|
||||||
|
@ -1327,8 +1332,11 @@ handle_printf_atsign (FILE *stream,
|
||||||
options: (unsigned)mask
|
options: (unsigned)mask
|
||||||
range: (NSRange)aRange
|
range: (NSRange)aRange
|
||||||
{
|
{
|
||||||
int i, start, stop, step;
|
int i;
|
||||||
NSRange range;
|
int start;
|
||||||
|
int stop;
|
||||||
|
int step;
|
||||||
|
NSRange range;
|
||||||
unichar (*cImp)(id, SEL, unsigned);
|
unichar (*cImp)(id, SEL, unsigned);
|
||||||
BOOL (*mImp)(id, SEL, unichar);
|
BOOL (*mImp)(id, SEL, unichar);
|
||||||
|
|
||||||
|
@ -1353,6 +1361,7 @@ handle_printf_atsign (FILE *stream,
|
||||||
for (i = start; i != stop; i += step)
|
for (i = start; i != stop; i += step)
|
||||||
{
|
{
|
||||||
unichar letter = (unichar)(*cImp)(self, caiSel, i);
|
unichar letter = (unichar)(*cImp)(self, caiSel, i);
|
||||||
|
|
||||||
if ((*mImp)(aSet, cMemberSel, letter))
|
if ((*mImp)(aSet, cMemberSel, letter))
|
||||||
{
|
{
|
||||||
range = NSMakeRange(i, 1);
|
range = NSMakeRange(i, 1);
|
||||||
|
@ -1365,19 +1374,21 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
- (NSRange) rangeOfString: (NSString*)string
|
- (NSRange) rangeOfString: (NSString*)string
|
||||||
{
|
{
|
||||||
NSRange all = NSMakeRange(0, [self length]);
|
NSRange all = NSMakeRange(0, [self length]);
|
||||||
|
|
||||||
return [self rangeOfString: string
|
return [self rangeOfString: string
|
||||||
options: 0
|
options: 0
|
||||||
range: all];
|
range: all];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSRange) rangeOfString: (NSString*)string
|
- (NSRange) rangeOfString: (NSString*)string
|
||||||
options: (unsigned)mask
|
options: (unsigned)mask
|
||||||
{
|
{
|
||||||
NSRange all = NSMakeRange(0, [self length]);
|
NSRange all = NSMakeRange(0, [self length]);
|
||||||
|
|
||||||
return [self rangeOfString: string
|
return [self rangeOfString: string
|
||||||
options: mask
|
options: mask
|
||||||
range: all];
|
range: all];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSRange) rangeOfString: (NSString *) aString
|
- (NSRange) rangeOfString: (NSString *) aString
|
||||||
|
@ -1391,18 +1402,18 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
- (unsigned int) indexOfString: (NSString *)substring
|
- (unsigned int) indexOfString: (NSString *)substring
|
||||||
{
|
{
|
||||||
NSRange range = {0, [self length]};
|
NSRange range = {0, [self length]};
|
||||||
|
|
||||||
range = [self rangeOfString:substring options:0 range:range];
|
range = [self rangeOfString: substring options: 0 range: range];
|
||||||
return range.length ? range.location : NSNotFound;
|
return range.length ? range.location : NSNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (unsigned int) indexOfString: (NSString*)substring fromIndex: (unsigned)index
|
- (unsigned int) indexOfString: (NSString*)substring fromIndex: (unsigned)index
|
||||||
{
|
{
|
||||||
NSRange range = {index, [self length]-index};
|
NSRange range = {index, [self length] - index};
|
||||||
|
|
||||||
range = [self rangeOfString:substring options:0 range:range];
|
range = [self rangeOfString: substring options: 0 range: range];
|
||||||
return range.length ? range.location : NSNotFound;
|
return range.length ? range.location : NSNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determining Composed Character Sequences
|
// Determining Composed Character Sequences
|
||||||
|
@ -1462,14 +1473,16 @@ handle_printf_atsign (FILE *stream,
|
||||||
|
|
||||||
- (BOOL) hasPrefix: (NSString*)aString
|
- (BOOL) hasPrefix: (NSString*)aString
|
||||||
{
|
{
|
||||||
NSRange range;
|
NSRange range;
|
||||||
|
|
||||||
range = [self rangeOfString: aString options: NSAnchoredSearch];
|
range = [self rangeOfString: aString options: NSAnchoredSearch];
|
||||||
return (range.length > 0) ? YES : NO;
|
return (range.length > 0) ? YES : NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) hasSuffix: (NSString*)aString
|
- (BOOL) hasSuffix: (NSString*)aString
|
||||||
{
|
{
|
||||||
NSRange range;
|
NSRange range;
|
||||||
|
|
||||||
range = [self rangeOfString: aString
|
range = [self rangeOfString: aString
|
||||||
options: NSAnchoredSearch | NSBackwardsSearch];
|
options: NSAnchoredSearch | NSBackwardsSearch];
|
||||||
return (range.length > 0) ? YES : NO;
|
return (range.length > 0) ? YES : NO;
|
||||||
|
@ -1518,8 +1531,10 @@ handle_printf_atsign (FILE *stream,
|
||||||
int len = [self length];
|
int len = [self length];
|
||||||
|
|
||||||
if (len > NSHashStringLength)
|
if (len > NSHashStringLength)
|
||||||
len = NSHashStringLength;
|
{
|
||||||
if (len)
|
len = NSHashStringLength;
|
||||||
|
}
|
||||||
|
if (len > 0)
|
||||||
{
|
{
|
||||||
unichar buf[len * MAXDEC + 1];
|
unichar buf[len * MAXDEC + 1];
|
||||||
GSeqStruct s = { buf, len, len * MAXDEC, 0 };
|
GSeqStruct s = { buf, len, len * MAXDEC, 0 };
|
||||||
|
@ -1738,10 +1753,10 @@ handle_printf_atsign (FILE *stream,
|
||||||
default:
|
default:
|
||||||
start--;
|
start--;
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
if (done)
|
if (done)
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
if (start == 0)
|
if (start == 0)
|
||||||
{
|
{
|
||||||
thischar = (*caiImp)(self, caiSel, start);
|
thischar = (*caiImp)(self, caiSel, start);
|
||||||
|
@ -1755,7 +1770,7 @@ handle_printf_atsign (FILE *stream,
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
start++;
|
start++;
|
||||||
|
@ -1769,6 +1784,7 @@ handle_printf_atsign (FILE *stream,
|
||||||
while (end < len)
|
while (end < len)
|
||||||
{
|
{
|
||||||
BOOL done = NO;
|
BOOL done = NO;
|
||||||
|
|
||||||
thischar = (*caiImp)(self, caiSel, end);
|
thischar = (*caiImp)(self, caiSel, end);
|
||||||
switch (thischar)
|
switch (thischar)
|
||||||
{
|
{
|
||||||
|
@ -1780,11 +1796,11 @@ handle_printf_atsign (FILE *stream,
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
end++;
|
end++;
|
||||||
if (done)
|
if (done)
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
if (end < len)
|
if (end < len)
|
||||||
{
|
{
|
||||||
if ((*caiImp)(self, caiSel, end) == (unichar)0x000D)
|
if ((*caiImp)(self, caiSel, end) == (unichar)0x000D)
|
||||||
|
@ -1928,7 +1944,7 @@ handle_printf_atsign (FILE *stream,
|
||||||
NSMutableData *m;
|
NSMutableData *m;
|
||||||
|
|
||||||
d = [self dataUsingEncoding: _DefaultStringEncoding
|
d = [self dataUsingEncoding: _DefaultStringEncoding
|
||||||
allowLossyConversion: NO];
|
allowLossyConversion: NO];
|
||||||
if (d == nil)
|
if (d == nil)
|
||||||
{
|
{
|
||||||
[NSException raise: NSCharacterConversionException
|
[NSException raise: NSCharacterConversionException
|
||||||
|
@ -2098,7 +2114,8 @@ handle_printf_atsign (FILE *stream,
|
||||||
- (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding
|
- (BOOL) canBeConvertedToEncoding: (NSStringEncoding)encoding
|
||||||
{
|
{
|
||||||
id d = [self dataUsingEncoding: encoding allowLossyConversion: NO];
|
id d = [self dataUsingEncoding: encoding allowLossyConversion: NO];
|
||||||
return d ? YES : NO;
|
|
||||||
|
return d != nil ? YES : NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
|
- (NSData*) dataUsingEncoding: (NSStringEncoding)encoding
|
||||||
|
@ -3020,17 +3037,23 @@ handle_printf_atsign (FILE *stream,
|
||||||
- (BOOL) writeToFile: (NSString*)filename
|
- (BOOL) writeToFile: (NSString*)filename
|
||||||
atomically: (BOOL)useAuxiliaryFile
|
atomically: (BOOL)useAuxiliaryFile
|
||||||
{
|
{
|
||||||
id d;
|
id d = [self dataUsingEncoding: _DefaultStringEncoding];
|
||||||
if (!(d = [self dataUsingEncoding: [NSString defaultCStringEncoding]]))
|
|
||||||
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
|
if (d == nil)
|
||||||
|
{
|
||||||
|
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
|
||||||
|
}
|
||||||
return [d writeToFile: filename atomically: useAuxiliaryFile];
|
return [d writeToFile: filename atomically: useAuxiliaryFile];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL) writeToURL: (NSURL*)anURL atomically: (BOOL)atomically
|
- (BOOL) writeToURL: (NSURL*)anURL atomically: (BOOL)atomically
|
||||||
{
|
{
|
||||||
id d;
|
id d = [self dataUsingEncoding: _DefaultStringEncoding];
|
||||||
if (!(d = [self dataUsingEncoding: [NSString defaultCStringEncoding]]))
|
|
||||||
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
|
if (d == nil)
|
||||||
|
{
|
||||||
|
d = [self dataUsingEncoding: NSUnicodeStringEncoding];
|
||||||
|
}
|
||||||
return [d writeToURL: anURL atomically: atomically];
|
return [d writeToURL: anURL atomically: atomically];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3198,7 +3221,8 @@ handle_printf_atsign (FILE *stream,
|
||||||
length: count
|
length: count
|
||||||
freeWhenDone: YES];
|
freeWhenDone: YES];
|
||||||
}
|
}
|
||||||
else if (enc == NSASCIIStringEncoding)
|
else if (enc == NSASCIIStringEncoding
|
||||||
|
|| enc == _DefaultStringEncoding)
|
||||||
{
|
{
|
||||||
unsigned char *chars;
|
unsigned char *chars;
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,7 @@ GetDefEncoding()
|
||||||
{
|
{
|
||||||
ret = str_encoding_table[count].enc;
|
ret = str_encoding_table[count].enc;
|
||||||
if ((ret == NSUnicodeStringEncoding)
|
if ((ret == NSUnicodeStringEncoding)
|
||||||
|
|| (ret == NSUTF8StringEncoding)
|
||||||
|| (ret == NSSymbolStringEncoding))
|
|| (ret == NSSymbolStringEncoding))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "WARNING: %s - encoding not supported as "
|
fprintf(stderr, "WARNING: %s - encoding not supported as "
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue