22

I am using aqueduct web api framework to support my flutter app. In my api backend I need to connect local network socket services. My problem is that I can't return the exact string (in tr). So, How can I convert string to utf8 in Dart?

Example:

@httpGet
Future<Response> getLogin() async {
    Socket.connect('192.168.1.22', 1024).then((socket) async {
    socket.listen((data) {
        // Expected return is: 1:_:2:_:175997:_:NİYAZİ TOROS
        print(new String.fromCharCodes(data).trim());
        xResult = new String.fromCharCodes(data).trim();
        print("xResult: $xResult");
    }, onDone: () {
        print("Done");
        socket.destroy();
    });

    socket.write('Q101:_:49785:_:x\r\n');
    });

    return new Response.ok(xResult);
}

The return is not in TR-tr language format.

Return text looks like:

**1:_:2:_:175997:_:NÝYAZÝ TOROS**

Correct must be:

**1:_:2:_:175997:_:NİYAZİ TOROS**

UPDATE:

  1. xResult = new String.fromCharCodes(data).trim();
  2. print(xResult);
  3. responseBody = xResult.transform(utf8.decoder);
  4. print(responseBody);

I can print the xResult but cannot print the responseBody after trying convert to UTF8

Benjamin Buch
  • 4,752
  • 7
  • 28
  • 51
  • What does "cannot print" mean? – Günter Zöchbauer Jun 29 '18 at 12:55
  • in the 4. step is not printing. means responseBody is null, meaning utf8.decoder didn't do anything –  Jun 29 '18 at 12:56
  • Why did you use `transform`? You are not using a stream. – Günter Zöchbauer Jun 29 '18 at 12:58
  • I don't know how to do it. I get confused –  Jun 29 '18 at 13:13
  • Ok. I cenge it to responseBody = utf8.decode(xResult); and still can't print responseBody –  Jun 29 '18 at 13:19
  • Hard to tell without more concrete information. Perhaps you need `print(utf8.decode(data));` – Günter Zöchbauer Jun 29 '18 at 13:30
  • it prints the first one like print("xResult: $xResult"); but doesnt print second one. print(utf8.decode(data)); than I put only print(utf8.decode(data)); and still didn't print anything. Only prints this line; xResult = new String.fromCharCodes(data).trim(); print("xResult: $xResult"); –  Jun 29 '18 at 13:40
  • Then the problem is probably already in `data`. – Günter Zöchbauer Jun 29 '18 at 13:43
  • I can print as 1::2::175997:_:NÝYAZÝ TOROS. But all the character Ý must be İ –  Jun 29 '18 at 13:47
  • and if I say print(data) I get this: [49, 58, 95, 58, 50, 58, 95, 58, 54, 50, 51, 52, 51, 48, 58, 95, 58, 78, 221, 89, 65, 90, 221, 32, 84, 79, 82, 79, 83, 13, 10] –  Jun 29 '18 at 13:48
  • Your data seems to be encoded as Latin-5 (https://en.wikipedia.org/wiki/ISO/IEC_8859-5). Dart does not have a built-in decoder for Latin-5 (only Latin-1 because that is a direct subset of Unicode code points so conversion is trivial). You will have to manually convert between Latin-5 and Unicode code points. When that is done, you can create a String using Strong.fromCharCodes. – lrn Jun 29 '18 at 15:47
  • Thanks Irn, I will try that –  Jun 29 '18 at 16:06
  • My bad, I was thinking of *Windows* Latin 5, not ISO Latin 5. Turkish is probably ISO Latin 9 instead. – lrn Jul 03 '18 at 09:15
  • Thanks Irn, I use simple switch statement to replace the character. I know the differences between Latin 1 and 9. –  Jul 03 '18 at 10:17
  • .runes.toList() for a String https://stackoverflow.com/questions/61496673/how-to-add-utf8-decoder-to-solve-the-problem-of-garbled-characters-in-flutter-ht – giorgio79 Jul 21 '21 at 03:18

7 Answers7

51
import 'dart:convert' show utf8;

var encoded = utf8.encode('Lorem ipsum dolor sit amet, consetetur...');
var decoded = utf8.decode(encoded);

See also https://api.dartlang.org/stable/1.24.3/dart-convert/UTF8-constant.html

There are also encoder and decoder to be used with streams

File.openRead().transform(utf8.decoder).

See also https://www.dartlang.org/articles/libraries/converters-and-codecs#converter

Max
  • 11
  • 4
Günter Zöchbauer
  • 623,577
  • 216
  • 2,003
  • 1,567
21
utf8.decode(stringData.runes.toList()),

This could be used to get the UTF-8 in flutter. here the stringData string will contain the necessary data with UTF-8 content.

Jithin U. Ahmed
  • 1,495
  • 1
  • 19
  • 29
2

Try to use utf-8 convertion Use this code

 final message =  utf8.decode(data);

Instead of this

final message = String.fromCharCodes(data);

import

 import 'dart:convert';

enter image description here

 void handleConnection(Socket client) {
print('Connection from'
    ' ${client.remoteAddress.address}:${client.remotePort}');

// listen for events from the client
client.listen(
  // handle data from the client
  (Uint8List data) async {
    await Future.delayed(Duration(seconds: 1));
    final message =  utf8.decode(data);
    // final message = String.fromCharCodes(data);
    int length = messageWidgets.length;
    Widget padding2 = Padding(
      padding: const EdgeInsets.all(8.0),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          Expanded(
            flex: 1,
            child: GestureDetector(
                onLongPress: () {
                  _copy(message);
                },
                onDoubleTap: () {
                  setState(() {
                    messageWidgets.removeAt(length);
                  });
                },
                child: Container(
                  padding: EdgeInsets.all(8.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(10),
                    color: Color(0xDD44871F),
                  ),
                  child: Stack(
                    children: <Widget>[
                      Column(
                        // direction: Axis.vertical,
                        children: [
                          Text("${client.remoteAddress.host}::-",
                              style: TextStyle(color: Colors.black87)),
                          Text("${message}",
                              style: TextStyle(color: Colors.black87)),
                        ],
                      )
                    ],
                  ),
                )),
          ),
          Expanded(
            flex: 1,
            child: Container(),
          ),
        ],
      ),
    );
    setState(() {
      messageWidgets.add(padding2);
    });
  },

  // handle errors
  onError: (error) {
    print(error);
    setMwidget(error);
    client.close();
  },

  // handle the client closing the connection
  onDone: () {
    print('Client left');
    client.close();
  },
);

}

lava
  • 6,020
  • 2
  • 31
  • 28
1

This is not the solution for your specific case but relative to the title.

If your string is a Uri, use:

final decodedUri = Uri.decodeFull('your-string-uri')

Android string Uri is an example use case, here is a demo before and after using Uri.decodeFull():

before decoding

after decoding

0

To/from Uint8List

//Uint8List to String
Uint8List bytes = utf8.encode(String s) as Uint8List;

//String to Uint8List
String s = utf8.decode(bytes.toList());
CNK
  • 567
  • 5
  • 6
0

Useful related convertions:

import 'dart:convert';
import 'dart:typed_data';

// Text to byte:
List<int> byteIntList = utf8.encode('yourTextHere');

// Text to Uint8List:
Uint8List myUint8List = utf8.encode('yourTextHere') as Uint8List;

// List<int> to Uint8List:
Uint8List myUint8List = Uint8List.fromList(byteIntList);
Elmar
  • 2,235
  • 24
  • 22
0
import 'dart:convert';

const originalString = 'En Español'; 
final decodedString = utf8.decode(originalString.codeUnits);
print(decodedString); // prints 'En Español'

Just an alternative in case you have to convert strings.

RoHaN
  • 372
  • 3
  • 14