Allow `errors` keyword for HDF IO Encoding Err Handling
State: closed

- [X] closes #20835
- [X] tests added / passed
- [X] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [X] whatsnew entry


Labels:
name: Unicode
description: Unicode strings
name: IO HDF5
description: read_hdf, HDFStore

Comments:
# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=h1) Report
> Merging [#20873](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/28edd06498987972953b5c8e1c98b7f55d24b8d2?src=pr&el=desc) will **increase** coverage by `<.01%`.
> The diff coverage is `93.1%`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/20873/graphs/tree.svg?width=650&height=150&token=eZ4WkYLtcO&src=pr)](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master   #20873      +/-   ##
==========================================
+ Coverage   91.78%   91.78%   +<.01%     
==========================================
  Files         153      153              
  Lines       49341    49319      -22     
==========================================
- Hits        45287    45267      -20     
+ Misses       4054     4052       -2
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `90.17% <89.65%> (-0.01%)` | :arrow_down: |
| #single | `41.89% <93.1%> (-0.05%)` | :arrow_down: |

| [Impacted Files](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pandas/io/pytables.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2lvL3B5dGFibGVzLnB5) | `92.43% <93.1%> (+0.01%)` | :arrow_up: |
| [pandas/core/indexes/datetimelike.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9kYXRldGltZWxpa2UucHk=) | `96.7% <0%> (-0.1%)` | :arrow_down: |
| [pandas/core/indexes/period.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9wZXJpb2QucHk=) | `92.61% <0%> (-0.07%)` | :arrow_down: |
| [pandas/core/arrays/categorical.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvYXJyYXlzL2NhdGVnb3JpY2FsLnB5) | `95.57% <0%> (-0.05%)` | :arrow_down: |
| [pandas/core/series.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvc2VyaWVzLnB5) | `93.99% <0%> (-0.04%)` | :arrow_down: |
| [pandas/core/indexes/base.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9iYXNlLnB5) | `96.63% <0%> (-0.01%)` | :arrow_down: |
| [pandas/core/resample.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvcmVzYW1wbGUucHk=) | `96.06% <0%> (-0.01%)` | :arrow_down: |
| [pandas/io/formats/latex.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2lvL2Zvcm1hdHMvbGF0ZXgucHk=) | `100% <0%> (ø)` | :arrow_up: |
| [pandas/core/indexes/datetimes.py](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9kYXRldGltZXMucHk=) | `95.76% <0%> (+0.03%)` | :arrow_up: |
| ... and [2 more](https://codecov.io/gh/pandas-dev/pandas/pull/20873/diff?src=pr&el=tree-more) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=footer). Last update [28edd06...9a13234](https://codecov.io/gh/pandas-dev/pandas/pull/20873?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

does anythng break if you just always pass ``surrogatepass`` when encoding? any downsides to that?
I think the biggest downside is that it's idiomatic in Python3 to have strict encoding when dealing with files, so if we did that here we'd introduce inconsistency with codecs handling in this project and with what I'd argue to be the larger Python ecosystem.

ref https://www.python.org/dev/peps/pep-0540/#encoding-and-error-handler
Appveyor failure is fixed in https://github.com/pandas-dev/pandas/pull/20906

I'm going to merge that before merging this, so that the merge commit is properly tested.
Thanks @WillAyd :)