Now correctly using urlencode for query parameters. Also handling unicode by converting to utf-8.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index d9fd085..f00188c 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -27,6 +27,7 @@
 import re
 import simplejson
 import uritemplate
+import urllib
 import urlparse
 
 
@@ -93,10 +94,13 @@
       return (headers, path_params, query, simplejson.dumps(model))
 
   def build_query(self, params):
-    query = '?alt=json&prettyprint=true'
-    for key,value in params.iteritems():
-      query += '&%s=%s' % (key, value)
-    return query
+    params.update({'alt': 'json', 'prettyprint': 'true'})
+    astuples = []
+    for key, value in params.iteritems():
+      if getattr(value, 'encode', False) and callable(value.encode):
+        value = value.encode('utf-8')
+      astuples.append((key, value))
+    return '?' + urllib.urlencode(astuples)
 
   def response(self, resp, content):
     # Error handling is TBD, for example, do we retry
diff --git a/runtests.py b/runtests.py
index c66b728..d36dd93 100644
--- a/runtests.py
+++ b/runtests.py
@@ -1,5 +1,9 @@
 #!/usr/bin/env python
-import glob, unittest, os, sys
+import glob
+import logging
+import os
+import sys
+import unittest
 
 from trace import fullmodname
 try:
@@ -10,6 +14,20 @@
 
 sys.path.insert(0, os.getcwd())
 
+verbosity = 1
+if "-q" in sys.argv or '--quiet' in sys.argv:
+    verbosity = 0
+if "-v" in sys.argv or '--verbose' in sys.argv:
+    verbosity = 2
+
+if verbosity == 0:
+  logging.disable(logging.CRITICAL)
+elif verbosity == 1:
+  logging.disable(logging.ERROR)
+elif verbosity == 2:
+  logging.basicConfig(level=logging.DEBUG)
+
+
 def build_suite(folder):
   # find all of the test modules
   modules = map(fullmodname, glob.glob(os.path.join(folder, 'test_*.py')))
@@ -25,12 +43,6 @@
           __import__(module)
       raise
 
-verbosity = 1
-if "-q" in sys.argv or '--quiet' in sys.argv:
-    verbosity = 0
-if "-v" in sys.argv or '--verbose' in sys.argv:
-    verbosity = 2
-
 unit_tests = build_suite('tests')
 functional_tests = build_suite('functional_tests')
 
diff --git a/tests/test_json_model.py b/tests/test_json_model.py
index 7af613f..3014ee4 100644
--- a/tests/test_json_model.py
+++ b/tests/test_json_model.py
@@ -24,6 +24,7 @@
 from apiclient.discovery import JsonModel
 import os
 import unittest
+import urlparse
 
 
 class Model(unittest.TestCase):
@@ -57,5 +58,24 @@
     self.assertNotEqual(query, '')
     self.assertEqual(body, '{"data": {}}')
 
+  def test_json_build_query(self):
+    model = JsonModel()
+
+    headers = {}
+    path_params = {}
+    query_params = {'foo': 1, 'bar': u'\N{COMET}'}
+    body = {}
+
+    headers, params, query, body = model.request(headers, path_params, query_params, body)
+
+    self.assertEqual(headers['accept'], 'application/json')
+    self.assertEqual(headers['content-type'], 'application/json')
+
+    query_dict = urlparse.parse_qs(query)
+    self.assertEqual(query_dict['foo'], ['1'])
+    self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
+    self.assertEqual(body, '{"data": {}}')
+
+
 if __name__ == '__main__':
   unittest.main()