Make gdbm and dumbdbm use byte strings.  Updated their tests.
diff --git a/Modules/gdbmmodule.c b/Modules/gdbmmodule.c
index 0ffb4b4..f3fee4d 100644
--- a/Modules/gdbmmodule.c
+++ b/Modules/gdbmmodule.c
@@ -90,8 +90,8 @@
 dbm_length(dbmobject *dp)
 {
     if (dp->di_dbm == NULL) {
-        PyErr_SetString(DbmError, "GDBM object has already been closed"); 
-        return -1; 
+        PyErr_SetString(DbmError, "GDBM object has already been closed");
+        return -1;
     }
     if (dp->di_size < 0) {
         datum key,okey;
@@ -127,11 +127,10 @@
     }
     drec = gdbm_fetch(dp->di_dbm, krec);
     if (drec.dptr == 0) {
-        PyErr_SetString(PyExc_KeyError,
-                        PyString_AS_STRING((PyStringObject *)key));
+        PyErr_SetObject(PyExc_KeyError, key);
         return NULL;
     }
-    v = PyString_FromStringAndSize(drec.dptr, drec.dsize);
+    v = PyBytes_FromStringAndSize(drec.dptr, drec.dsize);
     free(drec.dptr);
     return v;
 }
@@ -148,21 +147,20 @@
     }
     if (dp->di_dbm == NULL) {
         PyErr_SetString(DbmError,
-                        "GDBM object has already been closed"); 
-        return -1; 
+                        "GDBM object has already been closed");
+        return -1;
     }
     dp->di_size = -1;
     if (w == NULL) {
         if (gdbm_delete(dp->di_dbm, krec) < 0) {
-            PyErr_SetString(PyExc_KeyError,
-                            PyString_AS_STRING((PyStringObject *)v));
+            PyErr_SetObject(PyExc_KeyError, v);
             return -1;
         }
     }
     else {
         if (!PyArg_Parse(w, "s#", &drec.dptr, &drec.dsize)) {
             PyErr_SetString(PyExc_TypeError,
-                            "gdbm mappings have string elements only");
+                            "gdbm mappings have byte string elements only");
             return -1;
         }
         errno = 0;
@@ -198,6 +196,7 @@
     return Py_None;
 }
 
+/* XXX Should return a set or a set view */
 PyDoc_STRVAR(dbm_keys__doc__,
 "keys() -> list_of_keys\n\
 Get a list of all keys in the database.");
@@ -252,6 +251,11 @@
 			"GDBM object has already been closed");
 	return -1;
     }
+    if (PyUnicode_Check(arg)) {
+        arg = _PyUnicode_AsDefaultEncodedString(arg, NULL);
+        if (arg == NULL)
+            return -1;
+    }
     if (!PyString_Check(arg)) {
 	PyErr_Format(PyExc_TypeError,
 		     "gdbm key must be string, not %.100s",