Проблема с кодировкой NSString

У меня есть строка xml. Это неправильная строка. Но после использования NSLog и обработки его из консоли, это стало хорошей строкой (я получил хороший ответ от сервера). Я строю неправильную строку следующим образом:

NSString *soapMessage = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><env:Envelope xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:enc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:ns0=\"http://com.test/types/AstoriaObjectProperties\" xmlns:ns1=\"http://com.test/wsdl/AstoriaObjectProperties\" xmlns:ns2=\"http://java.sun.com/jax-rpc-ri/internal\"><env:Body><ns1:setObjectProperties env:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"><HashMap_1 xsi:type=\"ns2:hashMap\" enc:arrayType=\"ns2:mapEntry[2]\"><item xsi:type=\"ns2:mapEntry\"><key xsi:type=\"xsd:string\">id</key><value xsi:type=\"xsd:string\">%@</value></item><item xsi:type=\"ns2:mapEntry\"><key xsi:type=\"xsd:string\">annotations</key><value href=\"#ID1\"/></item></HashMap_1><HashMap_2 xsi:type=\"ns2:hashMap\" enc:arrayType=\"ns2:mapEntry[2]\"><item xsi:type=\"ns2:mapEntry\"><key xsi:type=\"xsd:string\">id</key><value xsi:type=\"xsd:string\">%@</value></item><item xsi:type=\"ns2:mapEntry\"><key xsi:type=\"xsd:string\">annotations</key><value href=\"#ID2\"/></item></HashMap_2></ns1:setObjectProperties>%@%@</env:Body></env:Envelope>", fileID, fileID, arrayNewXML, arrayOldXML];

Когда я отправил это сообщение на сервер, я получил в ответ ошибку.

Но затем я использую NSLog, чтобы увидеть soapMessage, копирую его и использую мыльное сообщение из буфера. Похоже на это.

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://com.test/types/AstoriaObjectProperties" xmlns:ns1="http://com.test/wsdl/AstoriaObjectProperties" xmlns:ns2="http://java.sun.com/jax-rpc-ri/internal"><env:Body><ns1:setObjectProperties env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><HashMap_1 xsi:type="ns2:hashMap" enc:arrayType="ns2:mapEntry[2]"><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">id</key><value xsi:type="xsd:string">0000001aWGA2070GYZ</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">annotations</key><value href="#ID1"/></item></HashMap_1><HashMap_2 xsi:type="ns2:hashMap" enc:arrayType="ns2:mapEntry[2]"><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">id</key><value xsi:type="xsd:string">0000001aWGA2070GYZ</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">annotations</key><value href="#ID2"/></item></HashMap_2></ns1:setObjectProperties><ns0:ArrayOfhashMap id="ID1" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="enc:Array" enc:arrayType="ns2:hashMap[1]"><item xsi:type="ns2:hashMap" enc:arrayType="ns2:mapEntry[7]"><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationUser$$$</key><value xsi:type="xsd:string">AstoriaAdmin</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">Annotation Status</key><value xsi:type="xsd:string">waiting for decision</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationID$$$</key><value xsi:type="xsd:string">00000043X951EE3073607F44F7D00000000000000951FF3076D000000590000003C647C7668696D696B2D6163733A433A5C50726F6772616D2046696C65735C4173746F72696120536F6674776172655C434D535C64617461626173655C63616231303030302E64627C31347C367C3263307C31303030303E00704B585000000000YZ</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">Annotation Comment</key><value xsi:type="xsd:string">comment</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationDate$$$</key><value xsi:type="enc:dateTime">2012-09-18T10:22:40.000Z</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">Annotation Status Comment</key><value xsi:type="xsd:string">status comment</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationName$$$</key><value xsi:type="xsd:string">Legal Review</value></item></item></ns0:ArrayOfhashMap><ns0:ArrayOfhashMap id="ID2" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="enc:Array" enc:arrayType="ns2:hashMap[1]"><item xsi:type="ns2:hashMap" enc:arrayType="ns2:mapEntry[7]"><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationUser$$$</key><value xsi:type="xsd:string">AstoriaAdmin</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">Annotation Status</key><value xsi:type="xsd:string">waiting for decision</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationID$$$</key><value xsi:type="xsd:string">00000043X951EE3073607F44F7D00000000000000951FF3076D000000590000003C647C7668696D696B2D6163733A433A5C50726F6772616D2046696C65735C4173746F72696120536F6674776172655C434D535C64617461626173655C63616231303030302E64627C31347C367C3263307C31303030303E00704B585000000000YZ</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">Annotation Comment</key><value xsi:type="xsd:string">comment</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationDate$$$</key><value xsi:type="enc:dateTime">2012-09-18T10:22:40.000Z</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">Annotation Status Comment</key><value xsi:type="xsd:string">status comment</value></item><item xsi:type="ns2:mapEntry"><key xsi:type="xsd:string">$$$XD_AnnotationName$$$</key><value xsi:type="xsd:string">Legal Review</value></item></item></ns0:ArrayOfhashMap></env:Body></env:Envelope>

И после этого у меня есть ответ без ошибок.

Мне кажется, что NSLog исправил некоторые проблемы с кодировкой. Но как решить эту проблему в моем soapMessage? Я пытался:

soapMessage = [soapMessage stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
soapMessage = [soapMessage stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
soapMessage = [soapMessage stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Это не помогло.


person Paul T.    schedule 18.09.2012    source источник
comment
Вы используете текст из консоли с тем же кодом или автономным клиентом?   -  person A-Live    schedule 18.09.2012
comment
Я использовал текст из консоли с тем же кодом   -  person Paul T.    schedule 19.09.2012
comment
Если запрос с пустыми параметрами должен быть действительным, я попытаюсь выполнить его, чтобы увидеть, является ли это литералом формата или проблемой параметров. Затем я попытался бы удалить как можно больше параметров (возможно, заменив параметры форматированной строки один за другим выводом консоли, таким образом вы сможете сузить проблему). Также, поскольку у вас есть тег encoding="UTF-8", я бы использовал параметры как [fileID UTF8String] , [arrayNewXML UTF8String] и т. д.   -  person A-Live    schedule 19.09.2012


Ответы (1)


Я просто использую кодировку и вручную удаляю некоторые неверные символы:

 NSMutableData *soapdata = [[[NSMutableData alloc] initWithData:[soapMessage dataUsingEncoding:NSNonLossyASCIIStringEncoding]] autorelease]; 
   soapMessage = [[[NSString alloc] initWithData:soapdata encoding:NSUTF8StringEncoding] autorelease];
   soapMessage = [soapMessage stringByReplacingOccurrencesOfString:@"\\ufffc" withString:@""];
   soapdata = [[[NSMutableData alloc] initWithData:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]] autorelease];

И теперь это работает!

person Paul T.    schedule 20.09.2012