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:
Richard Frith-Macdonald 2002-04-06 06:33:34 +00:00
parent e85bd56efa
commit b2d44357d6
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>
* Source/NSUser.m (NSSearchPathForDirectoriesInDomains): Fixed

View file

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

View file

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

View file

@ -38,6 +38,9 @@ main(int argc, char** argv, char **env)
NSProcessInfo *proc;
NSArray *args;
unsigned i;
BOOL found = NO;
NSString *n;
NSStringEncoding enc = 0;
#ifdef GS_PASS_ARGUMENTS
[NSProcessInfo initializeWithArguments: argv count: argc environment: env];
@ -53,84 +56,119 @@ main(int argc, char** argv, char **env)
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
{
NSString *n;
NSStringEncoding enc = 0;
NSStringEncoding *e;
NSMutableString *names;
n = [[NSUserDefaults standardUserDefaults] stringForKey: @"Encoding"];
if (n == nil)
names = [NSMutableString stringWithCapacity: 1024];
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;
NSMutableString *names;
names = [NSMutableString stringWithCapacity: 1024];
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);
}
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++;
continue;
NSLog(@"File read operation failed for %@.", file);
}
NS_DURING
else
{
NSData *myData;
NSString *myString;
unsigned l = [myData length];
const unichar *b = (const unichar*)[myData bytes];
NSStringEncoding iEnc;
NSStringEncoding oEnc;
NSString *myString;
myString = [NSString stringWithContentsOfFile: file];
myData = [myString dataUsingEncoding: enc
allowLossyConversion: NO];
if (myData == nil)
if (l > 1 && (*b == 0xFFFE || *b == 0xFEFF))
{
NSLog(@"Encoding conversion failed.", file);
iEnc = NSUnicodeStringEncoding;
oEnc = enc;
}
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 writeData: myData];
[out synchronizeFile];
out = [NSFileHandle fileHandleWithStandardOutput];
[out writeData: myData];
[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];
return 0;