diff --git a/lib/src/minio_helpers.dart b/lib/src/minio_helpers.dart
index 2f5f4fdb483d94316c2f71bc9faa4761e30df4be..ba1bf3a2a26c5928105fa76feb18b12cd9e55806 100644
--- a/lib/src/minio_helpers.dart
+++ b/lib/src/minio_helpers.dart
@@ -272,31 +272,7 @@ String encodePath(Uri uri) {
   return result.toString();
 }
 
-final _queryIgnoredChars = {
-  '-'.codeUnitAt(0),
-  '_'.codeUnitAt(0),
-  '.'.codeUnitAt(0),
-  '~'.codeUnitAt(0),
-};
-
 /// encode [uri].path to HTML hex escape sequence
 String encodeCanonicalQuery(String query) {
-  final result = StringBuffer();
-  for (var char in query.codeUnits) {
-    if (_A <= char && char <= _Z ||
-        _a <= char && char <= _z ||
-        _0 <= char && char <= _9) {
-      result.writeCharCode(char);
-      continue;
-    }
-
-    if (_queryIgnoredChars.contains(char)) {
-      result.writeCharCode(char);
-      continue;
-    }
-
-    result.write('%');
-    result.write(hex.encode([char]).toUpperCase());
-  }
-  return result.toString();
+  return Uri.encodeQueryComponent(query).replaceAll('+', '%20');
 }
diff --git a/test/minio_test.dart b/test/minio_test.dart
index 2104e21378d6b4829ef9a47de9dcbaea7da1fe5e..5913f263ff8a692d8c4e7caadb4996255912a977 100644
--- a/test/minio_test.dart
+++ b/test/minio_test.dart
@@ -323,21 +323,32 @@ void testGetObject() {
   group('getObject()', () {
     final minio = getMinioClient();
     final bucketName = uniqueName();
-    final objectName = uniqueName();
+    final object = uniqueName();
+    final objectUtf8 = uniqueName() + '/銇傘倠銇ㄣ亾銈�/鏌愪釜鏂囦欢.馃';
     final objectData = Uint8List.fromList([1, 2, 3]);
 
     setUpAll(() async {
       await minio.makeBucket(bucketName);
-      await minio.putObject(bucketName, objectName, Stream.value(objectData));
+      await minio.putObject(bucketName, object, Stream.value(objectData));
+      await minio.putObject(bucketName, objectUtf8, Stream.value(objectData));
     });
 
     tearDownAll(() async {
-      await minio.removeObject(bucketName, objectName);
+      await minio.removeObject(bucketName, object);
+      await minio.removeObject(bucketName, objectUtf8);
       await minio.removeBucket(bucketName);
     });
 
     test('succeeds', () async {
-      final stream = await minio.getObject(bucketName, objectName);
+      final stream = await minio.getObject(bucketName, object);
+      final buffer = BytesBuilder();
+      await stream.forEach((data) => buffer.add(data));
+      expect(stream.contentLength, equals(objectData.length));
+      expect(buffer.takeBytes(), equals(objectData));
+    });
+
+    test('succeeds with utf8 object name', () async {
+      final stream = await minio.getObject(bucketName, object);
       final buffer = BytesBuilder();
       await stream.forEach((data) => buffer.add(data));
       expect(stream.contentLength, equals(objectData.length));
@@ -346,14 +357,14 @@ void testGetObject() {
 
     test('fails on invalid bucket', () {
       expect(
-        () async => await minio.getObject('$bucketName-invalid', objectName),
+        () async => await minio.getObject('$bucketName-invalid', object),
         throwsA(isA<MinioError>()),
       );
     });
 
     test('fails on invalid object', () {
       expect(
-        () async => await minio.getObject(bucketName, '$objectName-invalid'),
+        () async => await minio.getObject(bucketName, '$object-invalid'),
         throwsA(isA<MinioError>()),
       );
     });
@@ -701,6 +712,7 @@ void testListObjects() {
 
     test('succeeds', () async {
       final result = await minio.listAllObjects(bucketName);
+      print(result);
       expect(result.objects.map((e) => e.key).contains(objectName), isTrue);
       expect(result.objects.map((e) => e.key).contains(objectNameUtf8), isTrue);
     });
@@ -731,6 +743,29 @@ void testListObjects() {
 
     test('succeeds', () async {
       final result = await minio.listAllObjects(bucket, prefix: 'new  folder/');
+      expect(result.objects.map((e) => e.key).contains(object), isTrue);
+    });
+  });
+
+  group('listAllObjects() works when prefix contains utf-8 characters', () {
+    final minio = getMinioClient();
+    final bucket = uniqueName();
+    final prefix = '馃崕馃尠馃崒馃崜/鏂囦欢澶�1/';
+    final object = '${prefix}new file.txt';
+    final data = Uint8List.fromList([1, 2, 3, 4, 5]);
+
+    setUpAll(() async {
+      await minio.makeBucket(bucket);
+      await minio.putObject(bucket, object, Stream.value(data));
+    });
+
+    tearDownAll(() async {
+      await minio.removeObject(bucket, object);
+      await minio.removeBucket(bucket);
+    });
+
+    test('succeeds', () async {
+      final result = await minio.listAllObjects(bucket, prefix: prefix);
       print(result);
       expect(result.objects.map((e) => e.key).contains(object), isTrue);
     });