Various unicode fixes made.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@13371 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
CaS 2002-04-06 06:33:34 +00:00
parent e32b1545f3
commit 5053fda75a
4 changed files with 102 additions and 58 deletions

View file

@ -1,3 +1,9 @@
2002-04-06 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSString.m: Fix error in unicode BOM handling
* Source/GSString.m: Fix error in length of unicode data produced.
* Tools/cvtenc.m: Made easy to use and added instructions.
Sat Apr 6 02:42:43 2002 Nicola Pero <n.pero@mi.flashnet.it> Sat Apr 6 02:42:43 2002 Nicola Pero <n.pero@mi.flashnet.it>
* Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Fixed * Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Fixed

View file

@ -813,7 +813,7 @@ dataUsingEncoding_c(ivars self, NSStringEncoding encoding, BOOL flag)
{ {
return nil; return nil;
} }
return [NSDataClass dataWithBytesNoCopy: r length: l]; return [NSDataClass dataWithBytesNoCopy: r length: l * sizeof(unichar)];
} }
else else
{ {

View file

@ -1166,12 +1166,12 @@ handle_printf_atsign (FILE *stream,
b = (unsigned char*)[data bytes]; b = (unsigned char*)[data bytes];
uptr = (unichar*)b; uptr = (unichar*)b;
if (*uptr == 0xFFFE) if (*uptr == byteOrderMark)
{ {
b = (unsigned char*)++uptr; b = (unsigned char*)++uptr;
len -= sizeof(unichar); len -= sizeof(unichar);
} }
else if (*uptr == 0xFEFF) else if (*uptr == byteOrderMarkSwapped)
{ {
b = (unsigned char*)++uptr; b = (unsigned char*)++uptr;
len -= sizeof(unichar); len -= sizeof(unichar);
@ -2376,7 +2376,7 @@ handle_printf_atsign (FILE *stream,
buff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(), buff = (unichar*)NSZoneMalloc(NSDefaultMallocZone(),
sizeof(unichar)*(len+1)); sizeof(unichar)*(len+1));
buff[0] = 0xFEFF; buff[0] = byteOrderMark;
[self getCharacters: &buff[1]]; [self getCharacters: &buff[1]];
return [NSDataClass dataWithBytesNoCopy: buff return [NSDataClass dataWithBytesNoCopy: buff
length: sizeof(unichar)*(len+1)]; length: sizeof(unichar)*(len+1)];

View file

@ -38,6 +38,9 @@ main(int argc, char** argv, char **env)
NSProcessInfo *proc; NSProcessInfo *proc;
NSArray *args; NSArray *args;
unsigned i; unsigned i;
BOOL found = NO;
NSString *n;
NSStringEncoding enc = 0;
#ifdef GS_PASS_ARGUMENTS #ifdef GS_PASS_ARGUMENTS
[NSProcessInfo initializeWithArguments: argv count: argc environment: env]; [NSProcessInfo initializeWithArguments: argv count: argc environment: env];
@ -53,84 +56,119 @@ main(int argc, char** argv, char **env)
args = [proc arguments]; args = [proc arguments];
if ([args count] <= 1) n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Encoding"];
if (n == nil)
{ {
NSLog(@"No file names given to convert."); enc = [NSString defaultCStringEncoding];
} }
else else
{ {
NSString *n; NSStringEncoding *e;
NSStringEncoding enc = 0; NSMutableString *names;
n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Encoding"]; names = [NSMutableString stringWithCapacity: 1024];
if (n == nil) e = [NSString availableStringEncodings];
while (*e != 0)
{ {
enc = [NSString defaultCStringEncoding]; NSString *name = [NSString localizedNameOfStringEncoding: *e];
[names appendFormat: @" %@\n", name];
if ([n isEqual: name] == YES)
{
enc = *e;
break;
}
e++;
} }
else if (enc == 0)
{ {
NSStringEncoding *e; NSLog(@"defaults: unable to find encoding '%@'!\n"
NSMutableString *names; @"Known encoding names are -\n%@", n, names);
[pool release];
names = [NSMutableString stringWithCapacity: 1024]; exit(0);
e = [NSString availableStringEncodings];
while (*e != 0)
{
NSString *name = [NSString localizedNameOfStringEncoding: *e];
[names appendFormat: @" %@\n", name];
if ([n isEqual: name] == YES)
{
enc = *e;
break;
}
e++;
}
if (enc == 0)
{
NSLog(@"defaults: unable to find encoding '%@'!\n"
@"Known encoding names are -\n%@", n, names);
[pool release];
exit(0);
}
} }
}
for (i = 1; i < [args count]; i++) for (i = 1; found == NO && i < [args count]; i++)
{
NSString *file = [args objectAtIndex: i];
if ([file isEqual: @"-Encoding"] == YES)
{ {
NSString *file = [args objectAtIndex: i]; i++;
continue;
}
found = YES;
NS_DURING
{
NSData *myData;
if ([file isEqual: @"-Encoding"] == YES) myData = [[NSData alloc] initWithContentsOfFile: file];
if (myData == nil)
{ {
i++; NSLog(@"File read operation failed for %@.", file);
continue;
} }
NS_DURING else
{ {
NSData *myData; unsigned l = [myData length];
NSString *myString; const unichar *b = (const unichar*)[myData bytes];
NSStringEncoding iEnc;
NSStringEncoding oEnc;
NSString *myString;
myString = [NSString stringWithContentsOfFile: file]; if (l > 1 && (*b == 0xFFFE || *b == 0xFEFF))
myData = [myString dataUsingEncoding: enc
allowLossyConversion: NO];
if (myData == nil)
{ {
NSLog(@"Encoding conversion failed.", file); iEnc = NSUnicodeStringEncoding;
oEnc = enc;
} }
else else
{ {
NSFileHandle *out; iEnc = enc;
oEnc = NSUnicodeStringEncoding;
}
myString = [[NSString alloc] initWithData: myData
encoding: iEnc];
RELEASE(myData);
if (myString == nil)
{
NSLog(@"Encoding input conversion failed for %@.", file);
}
else
{
myData = [myString dataUsingEncoding: oEnc
allowLossyConversion: NO];
RELEASE(myString);
if (myData == nil)
{
NSLog(@"Encoding output conversion failed for %@.",
file);
}
else
{
NSFileHandle *out;
out = [NSFileHandle fileHandleWithStandardOutput]; out = [NSFileHandle fileHandleWithStandardOutput];
[out writeData: myData]; [out writeData: myData];
[out synchronizeFile]; [out synchronizeFile];
}
} }
} }
NS_HANDLER
{
NSLog(@"Converting '%@' - %@", file, [localException reason]);
}
NS_ENDHANDLER
} }
NS_HANDLER
{
NSLog(@"Converting '%@' - %@", file, [localException reason]);
}
NS_ENDHANDLER
}
if (found == NO)
{
NSLog(@"\nThis utility expects a filename as an argument.\n"
@"It reads the file, and writes it to STDOUT after converting it\n"
@"to unicode from C string encoding or vice versa.\n"
@"You can supply a '-Encoding name' option to specify the C string\n"
@"encoding to be used, if you don't want to use the default.");
} }
[pool release]; [pool release];
return 0; return 0;